From 14f9b6dca4b2f7fb9f0d1b8bf4b23e41c6ea7773 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Thu, 15 May 2025 03:35:41 -0400 Subject: [PATCH 01/19] initial commit for fern's readline impl --- Cargo.lock | 158 +---------------- Cargo.toml | 2 +- src/libsh/error.rs | 6 - src/prompt/highlight.rs | 248 -------------------------- src/prompt/mod.rs | 72 +------- src/prompt/readline.rs | 351 +++++++++++++++++++++++++++++-------- src/prompt/readline_old.rs | 86 +++++++++ src/shopt.rs | 21 --- src/tests/highlight.rs | 26 --- 9 files changed, 375 insertions(+), 595 deletions(-) create mode 100644 src/prompt/readline_old.rs diff --git a/Cargo.lock b/Cargo.lock index ee5739c..01c5fe6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -47,7 +47,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -58,7 +58,7 @@ checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", "once_cell", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -119,15 +119,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "clipboard-win" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" -dependencies = [ - "error-code", -] - [[package]] name = "colorchoice" version = "1.0.3" @@ -143,7 +134,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -158,39 +149,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" -[[package]] -name = "endian-type" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" - -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "error-code" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" - -[[package]] -name = "fd-lock" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" -dependencies = [ - "cfg-if", - "rustix", - "windows-sys 0.52.0", -] - [[package]] name = "fern" version = "0.1.0" @@ -202,7 +160,7 @@ dependencies = [ "nix", "pretty_assertions", "regex", - "rustyline", + "unicode-width", ] [[package]] @@ -217,15 +175,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "insta" version = "1.42.2" @@ -257,33 +206,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "log" -version = "0.4.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" - [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "nibble_vec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" -dependencies = [ - "smallvec", -] - [[package]] name = "nix" version = "0.29.0" @@ -350,16 +278,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radix_trie" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" -dependencies = [ - "endian-type", - "nibble_vec", -] - [[package]] name = "regex" version = "1.11.1" @@ -389,65 +307,12 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustyline" -version = "15.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee1e066dc922e513bda599c6ccb5f3bb2b0ea5870a579448f2622993f0a9a2f" -dependencies = [ - "bitflags", - "cfg-if", - "clipboard-win", - "fd-lock", - "home", - "libc", - "log", - "memchr", - "nix", - "radix_trie", - "rustyline-derive", - "unicode-segmentation", - "unicode-width", - "utf8parse", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustyline-derive" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327e9d075f6df7e25fbf594f1be7ef55cf0d567a6cb5112eeccbbd51ceb48e0d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "similar" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" -[[package]] -name = "smallvec" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" - [[package]] name = "strsim" version = "0.11.1" @@ -471,12 +336,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - [[package]] name = "unicode-width" version = "0.2.0" @@ -489,15 +348,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.59.0" diff --git a/Cargo.toml b/Cargo.toml index b4b899b..409109c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ insta = "1.42.2" nix = { version = "0.29.0", features = ["uio", "term", "user", "hostname", "fs", "default", "signal", "process", "event", "ioctl"] } pretty_assertions = "1.4.1" regex = "1.11.1" -rustyline = { version = "15.0.0", features = [ "derive" ] } +unicode-width = "0.2.0" [[bin]] name = "fern" diff --git a/src/libsh/error.rs b/src/libsh/error.rs index 2206599..c0ec7f0 100644 --- a/src/libsh/error.rs +++ b/src/libsh/error.rs @@ -303,12 +303,6 @@ impl From for ShErr { } } -impl From for ShErr { - fn from(value: rustyline::error::ReadlineError) -> Self { - ShErr::simple(ShErrKind::ParseErr, value.to_string()) - } -} - impl From for ShErr { fn from(value: Errno) -> Self { ShErr::simple(ShErrKind::Errno, value.to_string()) diff --git a/src/prompt/highlight.rs b/src/prompt/highlight.rs index 82f6ff5..e69de29 100644 --- a/src/prompt/highlight.rs +++ b/src/prompt/highlight.rs @@ -1,248 +0,0 @@ -use std::{env, mem, os::unix::fs::PermissionsExt, path::{Path, PathBuf}, sync::Arc}; -use crate::builtin::BUILTINS; - -use rustyline::highlight::Highlighter; -use crate::{libsh::term::{Style, StyleSet, Styled}, parse::lex::{LexFlags, LexStream, Tk, TkFlags, TkRule}, state::read_logic}; - -use super::readline::FernReadline; - -fn is_executable(path: &Path) -> bool { - path.metadata() - .map(|m| m.permissions().mode() & 0o111 != 0) - .unwrap_or(false) -} - -#[derive(Default,Debug)] -pub struct FernHighlighter { - input: String, -} - -impl FernHighlighter { - pub fn new(input: String) -> Self { - Self { - input, - } - } - pub fn highlight_subsh(&self, token: Tk) -> String { - if token.flags.contains(TkFlags::IS_SUBSH) { - let raw = token.as_str(); - Self::hl_subsh_raw(raw) - } else if token.flags.contains(TkFlags::IS_CMDSUB) { - let raw = token.as_str(); - Self::hl_cmdsub_raw(raw) - } else { - unreachable!() - } - } - pub fn hl_subsh_raw(raw: &str) -> String { - let mut body = &raw[1..]; - let mut closed = false; - if body.ends_with(')') { - body = &body[..body.len() - 1]; - closed = true; - } - let sub_hl = FernHighlighter::new(body.to_string()); - let body_highlighted = sub_hl.hl_input(); - let open_paren = "(".styled(Style::BrightBlue); - let close_paren = ")".styled(Style::BrightBlue); - let mut result = format!("{open_paren}{body_highlighted}"); - if closed { - result.push_str(&close_paren); - } - result - } - pub fn hl_cmdsub_raw(raw: &str) -> String { - let mut body = &raw[2..]; - let mut closed = false; - if body.ends_with(')') { - body = &body[..body.len() - 1]; - closed = true; - } - let sub_hl = FernHighlighter::new(body.to_string()); - let body_highlighted = sub_hl.hl_input(); - let dollar_paren = "$(".styled(Style::BrightBlue); - let close_paren = ")".styled(Style::BrightBlue); - let mut result = format!("{dollar_paren}{body_highlighted}"); - if closed { - result.push_str(&close_paren); - } - result - } - pub fn hl_command(&self, token: Tk) -> String { - let raw = token.as_str(); - let paths = env::var("PATH") - .unwrap_or_default(); - let mut paths = paths.split(':'); - - let is_in_path = { - loop { - let Some(path) = paths.next() else { - break false - }; - - let mut path = PathBuf::from(path); - path.push(PathBuf::from(raw)); - - if path.is_file() && is_executable(&path) { - break true - }; - } - }; - // TODO: zsh is capable of highlighting an alias red even if it exists, if the command it refers to is not found - // Implement some way to find out if the content of the alias is valid as well - let is_alias_or_function = read_logic(|l| { - l.get_func(raw).is_some() || l.get_alias(raw).is_some() - }); - - let is_builtin = BUILTINS.contains(&raw); - - if is_alias_or_function || is_in_path || is_builtin { - raw.styled(Style::Green) - } else { - raw.styled(Style::Bold | Style::Red) - } - } - pub fn hl_dquote(&self, token: Tk) -> String { - let raw = token.as_str(); - let mut chars = raw.chars().peekable(); - const YELLOW: &str = "\x1b[33m"; - const RESET: &str = "\x1b[0m"; - let mut result = String::new(); - let mut dquote_count = 0; - - result.push_str(YELLOW); - - while let Some(ch) = chars.next() { - match ch { - '\\' => { - result.push(ch); - if let Some(ch) = chars.next() { - result.push(ch); - } - } - '"' => { - dquote_count += 1; - result.push(ch); - if dquote_count >= 2 { - break - } - } - '$' if chars.peek() == Some(&'(') => { - let mut raw_cmd_sub = String::new(); - raw_cmd_sub.push(ch); - raw_cmd_sub.push(chars.next().unwrap()); - let mut cmdsub_count = 1; - - while let Some(cmdsub_ch) = chars.next() { - match cmdsub_ch { - '\\' => { - raw_cmd_sub.push(cmdsub_ch); - if let Some(ch) = chars.next() { - raw_cmd_sub.push(ch); - } - } - '$' if chars.peek() == Some(&'(') => { - cmdsub_count += 1; - raw_cmd_sub.push(cmdsub_ch); - raw_cmd_sub.push(chars.next().unwrap()); - } - ')' => { - cmdsub_count -= 1; - raw_cmd_sub.push(cmdsub_ch); - if cmdsub_count <= 0 { - let styled = Self::hl_cmdsub_raw(&mem::take(&mut raw_cmd_sub)); - result.push_str(&styled); - result.push_str(YELLOW); - break - } - } - _ => raw_cmd_sub.push(cmdsub_ch) - } - } - if !raw_cmd_sub.is_empty() { - let styled = Self::hl_cmdsub_raw(&mem::take(&mut raw_cmd_sub)); - result.push_str(&styled); - result.push_str(YELLOW); - } - } - _ => result.push(ch) - } - } - - result.push_str(RESET); - - result - } - pub fn hl_input(&self) -> String { - let mut output = self.input.clone(); - - // TODO: properly implement highlighting for unfinished input - let lex_results = LexStream::new(Arc::new(output.clone()), LexFlags::LEX_UNFINISHED); - let mut tokens = vec![]; - - for result in lex_results { - let Ok(token) = result else { - return self.input.clone(); - }; - tokens.push(token) - } - - // Reverse the tokens, because we want to highlight from right to left - // Doing it this way allows us to trust the spans in the tokens throughout the entire process - let tokens = tokens.into_iter() - .rev() - .collect::>(); - for token in tokens { - match token.class { - _ if token.flags.intersects(TkFlags::IS_CMDSUB | TkFlags::IS_SUBSH) => { - let styled = self.highlight_subsh(token.clone()); - output.replace_range(token.span.start..token.span.end, &styled); - } - TkRule::Str => { - if token.flags.contains(TkFlags::IS_CMD) { - let styled = self.hl_command(token.clone()); - output.replace_range(token.span.start..token.span.end, &styled); - } else if is_dquote(&token) { - let styled = self.hl_dquote(token.clone()); - output.replace_range(token.span.start..token.span.end, &styled); - } else { - output.replace_range(token.span.start..token.span.end, &token.to_string()); - } - } - TkRule::Pipe | - TkRule::ErrPipe | - TkRule::And | - TkRule::Or | - TkRule::Bg | - TkRule::Sep | - TkRule::Redir => self.style_with_token(&token,&mut output,Style::Cyan.into()), - TkRule::CasePattern => self.style_with_token(&token,&mut output,Style::Blue.into()), - TkRule::BraceGrpStart | - TkRule::BraceGrpEnd => self.style_with_token(&token,&mut output,Style::Cyan.into()), - TkRule::Comment => self.style_with_token(&token,&mut output,Style::BrightBlack.into()), - _ => { output.replace_range(token.span.start..token.span.end, &token.to_string()); } - } - } - - output - } - fn style_with_token(&self, token: &Tk, highlighted: &mut String, style: StyleSet) { - let styled = token.to_string().styled(style); - highlighted.replace_range(token.span.start..token.span.end, &styled); - } -} - -impl Highlighter for FernReadline { - fn highlight<'l>(&self, line: &'l str, _pos: usize) -> std::borrow::Cow<'l, str> { - let highlighter = FernHighlighter::new(line.to_string()); - std::borrow::Cow::Owned(highlighter.hl_input()) - } - fn highlight_char(&self, _line: &str, _pos: usize, _kind: rustyline::highlight::CmdKind) -> bool { - true - } -} - -fn is_dquote(token: &Tk) -> bool { - let raw = token.as_str(); - raw.starts_with('"') -} diff --git a/src/prompt/mod.rs b/src/prompt/mod.rs index 6d52879..0c6bea4 100644 --- a/src/prompt/mod.rs +++ b/src/prompt/mod.rs @@ -3,89 +3,25 @@ pub mod highlight; use std::path::Path; -use readline::FernReadline; -use rustyline::{error::ReadlineError, history::FileHistory, ColorMode, Config, Editor}; +use readline::FernReader; use crate::{expand::expand_prompt, libsh::error::ShResult, prelude::*, state::read_shopts}; /// Initialize the line editor -fn init_rl() -> ShResult> { - let rl = FernReadline::new(); - - let tab_stop = read_shopts(|s| s.prompt.tab_stop); - let edit_mode = read_shopts(|s| s.prompt.edit_mode).into(); - let bell_style = read_shopts(|s| s.core.bell_style).into(); - let ignore_dups = read_shopts(|s| s.core.hist_ignore_dupes); - let comp_limit = read_shopts(|s| s.prompt.comp_limit); - let auto_hist = read_shopts(|s| s.core.auto_hist); - let max_hist = read_shopts(|s| s.core.max_hist); - let color_mode = match read_shopts(|s| s.prompt.prompt_highlight) { - true => ColorMode::Enabled, - false => ColorMode::Disabled, - }; - - let config = Config::builder() - .tab_stop(tab_stop) - .indent_size(1) - .edit_mode(edit_mode) - .bell_style(bell_style) - .color_mode(color_mode) - .history_ignore_dups(ignore_dups).unwrap() - .completion_prompt_limit(comp_limit) - .auto_add_history(auto_hist) - .max_history_size(max_hist).unwrap() - .build(); - - let mut editor = Editor::with_config(config).unwrap(); - - editor.set_helper(Some(rl)); - editor.load_history(&Path::new("/home/pagedmov/.fernhist"))?; - Ok(editor) -} - fn get_prompt() -> ShResult { let Ok(prompt) = env::var("PS1") else { // username@hostname // short/path/to/pwd/ // $ - let default = "\\e[1;0m\\u\\e[1;36m@\\e[1;31m\\h\\n\\e[1;36m\\W\\e[1;32m/\\n\\e[1;32m\\$ "; + let default = "\\e[1;0m\\u\\e[1;36m@\\e[1;31m\\h\\n\\e[1;36m\\W\\e[1;32m/\\n\\e[1;32m\\$\\e[0m "; return Ok(format!("\n{}",expand_prompt(default)?)) }; Ok(format!("\n{}",expand_prompt(&prompt)?)) } -fn get_hist_path() -> ShResult { - if let Ok(path) = env::var("FERN_HIST") { - Ok(PathBuf::from(path)) - } else { - let home = env::var("HOME")?; - let path = PathBuf::from(format!("{home}/.fernhist")); - Ok(path) - } - -} - pub fn read_line() -> ShResult { - assert!(isatty(STDIN_FILENO).unwrap()); - let mut editor = init_rl()?; let prompt = get_prompt()?; - match editor.readline(&prompt) { - Ok(line) => { - if !line.is_empty() { - let hist_path = get_hist_path()?; - editor.add_history_entry(&line)?; - editor.save_history(&hist_path)?; - } - Ok(line) - } - Err(ReadlineError::Eof) => { - kill(Pid::this(), Signal::SIGQUIT)?; - Ok(String::new()) - } - Err(ReadlineError::Interrupted) => Ok(String::new()), - Err(e) => { - Err(e.into()) - } - } + let mut reader = FernReader::new(prompt); + reader.readline() } diff --git a/src/prompt/readline.rs b/src/prompt/readline.rs index 4050835..85d5109 100644 --- a/src/prompt/readline.rs +++ b/src/prompt/readline.rs @@ -1,86 +1,295 @@ -use rustyline::{completion::Completer, hint::{Hint, Hinter}, history::SearchDirection, validate::{ValidationResult, Validator}, Helper}; +use std::{arch::asm, os::fd::BorrowedFd}; -use crate::{libsh::term::{Style, Styled}, parse::{lex::{LexFlags, LexStream}, ParseStream}}; -use crate::prelude::*; +use nix::{libc::STDIN_FILENO, sys::termios::{self, Termios}, unistd::read}; +use unicode_width::UnicodeWidthStr; + +use crate::{libsh::error::ShResult, prelude::*}; + +#[derive(Clone,Copy,Debug)] +pub enum Key { + Char(char), + Enter, + Backspace, + Esc, + Up, + Down, + Left, + Right, + Ctrl(char), + Unknown, +} + +#[derive(Debug)] +pub struct Terminal { + stdin: RawFd, + stdout: RawFd, +} + +impl Terminal { + pub fn new() -> Self { + assert!(isatty(0).unwrap()); + Self { + stdin: 0, + stdout: 1, + } + } + fn raw_mode() -> termios::Termios { + // Get the current terminal attributes + let orig_termios = unsafe { termios::tcgetattr(BorrowedFd::borrow_raw(STDIN_FILENO)).expect("Failed to get terminal attributes") }; + + // Make a mutable copy + let mut raw = orig_termios.clone(); + + // Apply raw mode flags + termios::cfmakeraw(&mut raw); + + // Set the attributes immediately + unsafe { termios::tcsetattr(BorrowedFd::borrow_raw(STDIN_FILENO), termios::SetArg::TCSANOW, &raw) } + .expect("Failed to set terminal to raw mode"); + + // Return original attributes so they can be restored later + orig_termios + } + pub fn restore_termios(termios: Termios) { + unsafe { termios::tcsetattr(BorrowedFd::borrow_raw(STDIN_FILENO), termios::SetArg::TCSANOW, &termios) } + .expect("Failed to restore terminal settings"); + } + pub fn with_raw_mode R,R>(func: F) -> R { + let saved = Self::raw_mode(); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(func)); + Self::restore_termios(saved); + + match result { + Ok(r) => r, + Err(e) => std::panic::resume_unwind(e) + } + } + pub fn read_byte(&self, buf: &mut [u8]) -> usize { + Self::with_raw_mode(|| { + let ret: usize; + unsafe { + let buf_ptr = buf.as_mut_ptr(); + let len = buf.len(); + asm! ( + "syscall", + in("rax") 0, + in("rdi") self.stdin, + in("rsi") buf_ptr, + in("rdx") len, + lateout("rax") ret, + out("rcx") _, + out("r11") _, + ); + } + ret + }) + } + pub fn write_bytes(&self, buf: &[u8]) { + Self::with_raw_mode(|| { + let _ret: usize; + unsafe { + let buf_ptr = buf.as_ptr(); + let len = buf.len(); + asm!( + "syscall", + in("rax") 1, + in("rdi") self.stdout, + in("rsi") buf_ptr, + in("rdx") len, + lateout("rax") _ret, + out("rcx") _, + out("r11") _, + ); + } + }); + } + pub fn write(&self, s: &str) { + self.write_bytes(s.as_bytes()); + } + pub fn writeln(&self, s: &str) { + self.write(s); + self.write_bytes(b"\r\n"); + } +} + +impl Default for Terminal { + fn default() -> Self { + Self::new() + } +} #[derive(Default,Debug)] -pub struct FernReadline; +pub struct FernReader { + pub term: Terminal, + pub prompt: String, + pub line: LineBuf, + pub editor: EditMode +} -impl FernReadline { +impl FernReader { + pub fn new(prompt: String) -> Self { + Self { + term: Terminal::new(), + prompt, + line: Default::default(), + editor: Default::default() + } + } + fn pack_line(&self) -> String { + self.line + .buffer + .iter() + .collect::() + } + pub fn readline(&mut self) -> ShResult { + self.display_line(false); + loop { + let key = self.read_key().unwrap(); + self.process_key(key); + self.display_line(true); + if let Key::Enter = key { + self.term.write_bytes(b"\r"); + break + } + } + Ok(self.pack_line()) + } + pub fn process_key(&mut self, key: Key) { + match key { + Key::Char(ch) => { + self.line.insert_at_cursor(ch); + } + Key::Enter => { + self.line.insert_at_cursor('\n'); + } + Key::Backspace => self.line.backspace_at_cursor(), + Key::Esc => todo!(), + Key::Up => todo!(), + Key::Down => todo!(), + Key::Left => self.line.move_cursor_left(), + Key::Right => self.line.move_cursor_right(), + Key::Ctrl(ctrl) => todo!(), + Key::Unknown => todo!(), + } + } + fn clear_line(&self) { + let prompt_lines = self.prompt.lines().count(); + let buf_lines = self.line.count_lines().saturating_sub(1); // One of the buffer's lines will overlap with the prompt + let total = prompt_lines + buf_lines; + self.term.write_bytes(b"\r\n"); + for _ in 0..total { + self.term.write_bytes(b"\r\x1b[2K\x1b[1A"); + } + self.term.write_bytes(b"\r\x1b[2K"); + } + fn display_line(&self, refresh: bool) { + if refresh { + self.clear_line(); + } + let mut prompt_lines = self.prompt.lines().peekable(); + let mut last_line_len = 0; + while let Some(line) = prompt_lines.next() { + if prompt_lines.peek().is_none() { + last_line_len = strip_ansi_codes(line).width(); + self.term.write(line); + } else { + self.term.writeln(line); + } + } + self.term.write(&self.pack_line()); + + let cursor_offset = self.line.cursor + last_line_len; + self.term.write_bytes(format!("\r\x1b[{}C", cursor_offset).as_bytes()); + } + fn read_key(&mut self) -> Option { + let mut buf = [0; 3]; + + let n = self.term.read_byte(&mut buf); + if n == 0 { + return None; + } + match buf[0] { + b'\x1b' => { + if n == 3 { + match (buf[1], buf[2]) { + (b'[', b'A') => Some(Key::Up), + (b'[', b'B') => Some(Key::Down), + (b'[', b'C') => Some(Key::Right), + (b'[', b'D') => Some(Key::Left), + _ => Some(Key::Esc), + } + } else { + Some(Key::Esc) + } + } + b'\r' | b'\n' => Some(Key::Enter), + 0x7f => Some(Key::Backspace), + c if (c as char).is_ascii_control() => { + let ctrl = (c ^ 0x40) as char; + Some(Key::Ctrl(ctrl)) + } + c => Some(Key::Char(c as char)) + } + } +} + +#[derive(Default,Debug)] +pub enum EditMode { + Normal, + #[default] + Insert, +} + +#[derive(Default,Debug)] +pub struct LineBuf { + buffer: Vec, + cursor: usize +} + +impl LineBuf { pub fn new() -> Self { - Self + Self::default() } - pub fn search_hist(value: &str, ctx: &rustyline::Context<'_>) -> Option { - let len = ctx.history().len(); - for i in 0..len { - let entry = ctx.history().get(i, SearchDirection::Reverse).unwrap().unwrap(); - if entry.entry.starts_with(value) { - return Some(entry.entry.into_owned()) - } + pub fn count_lines(&self) -> usize { + self.buffer.iter().filter(|&&c| c == '\n').count() + } + pub fn insert_at_cursor(&mut self, ch: char) { + self.buffer.insert(self.cursor, ch); + self.move_cursor_right(); + } + pub fn backspace_at_cursor(&mut self) { + if self.buffer.is_empty() { + return } - None + self.buffer.remove(self.cursor.saturating_sub(1)); + self.move_cursor_left(); + } + pub fn move_cursor_left(&mut self) { + self.cursor = self.cursor.saturating_sub(1); + } + pub fn move_cursor_right(&mut self) { + self.cursor = self.cursor.saturating_add(1); } } -impl Helper for FernReadline {} +pub fn strip_ansi_codes(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + let mut chars = s.chars().peekable(); -impl Completer for FernReadline { - type Candidate = String; -} - -pub struct FernHint { - raw: String, - styled: String -} - -impl FernHint { - pub fn new(raw: String) -> Self { - let styled = (&raw).styled(Style::Dim | Style::BrightBlack); - Self { raw, styled } - } -} - -impl Hint for FernHint { - fn display(&self) -> &str { - &self.styled - } - fn completion(&self) -> Option<&str> { - if !self.raw.is_empty() { - Some(&self.raw) + while let Some(c) = chars.next() { + if c == '\x1b' && chars.peek() == Some(&'[') { + // Skip over the escape sequence + chars.next(); // consume '[' + while let Some(&ch) = chars.peek() { + if ch.is_ascii_lowercase() || ch.is_ascii_uppercase() { + chars.next(); // consume final letter + break; + } + chars.next(); // consume intermediate characters + } } else { - None + out.push(c); } } -} - -impl Hinter for FernReadline { - type Hint = FernHint; - fn hint(&self, line: &str, pos: usize, ctx: &rustyline::Context<'_>) -> Option { - if line.is_empty() { - return None - } - let ent = Self::search_hist(line,ctx)?; - let entry_raw = ent.get(pos..)?.to_string(); - Some(FernHint::new(entry_raw)) - } -} - -impl Validator for FernReadline { - fn validate(&self, ctx: &mut rustyline::validate::ValidationContext) -> rustyline::Result { - let mut tokens = vec![]; - let tk_stream = LexStream::new(Arc::new(ctx.input().to_string()), LexFlags::empty()); - for tk in tk_stream { - if tk.is_err() { - return Ok(ValidationResult::Incomplete) - } - tokens.push(tk.unwrap()); - } - let nd_stream = ParseStream::new(tokens); - for nd in nd_stream { - if nd.is_err() { - return Ok(ValidationResult::Incomplete) - } - } - Ok(ValidationResult::Valid(None)) - } + out } diff --git a/src/prompt/readline_old.rs b/src/prompt/readline_old.rs new file mode 100644 index 0000000..4050835 --- /dev/null +++ b/src/prompt/readline_old.rs @@ -0,0 +1,86 @@ +use rustyline::{completion::Completer, hint::{Hint, Hinter}, history::SearchDirection, validate::{ValidationResult, Validator}, Helper}; + +use crate::{libsh::term::{Style, Styled}, parse::{lex::{LexFlags, LexStream}, ParseStream}}; +use crate::prelude::*; + +#[derive(Default,Debug)] +pub struct FernReadline; + +impl FernReadline { + pub fn new() -> Self { + Self + } + pub fn search_hist(value: &str, ctx: &rustyline::Context<'_>) -> Option { + let len = ctx.history().len(); + for i in 0..len { + let entry = ctx.history().get(i, SearchDirection::Reverse).unwrap().unwrap(); + if entry.entry.starts_with(value) { + return Some(entry.entry.into_owned()) + } + } + None + } +} + +impl Helper for FernReadline {} + +impl Completer for FernReadline { + type Candidate = String; +} + +pub struct FernHint { + raw: String, + styled: String +} + +impl FernHint { + pub fn new(raw: String) -> Self { + let styled = (&raw).styled(Style::Dim | Style::BrightBlack); + Self { raw, styled } + } +} + +impl Hint for FernHint { + fn display(&self) -> &str { + &self.styled + } + fn completion(&self) -> Option<&str> { + if !self.raw.is_empty() { + Some(&self.raw) + } else { + None + } + } +} + +impl Hinter for FernReadline { + type Hint = FernHint; + fn hint(&self, line: &str, pos: usize, ctx: &rustyline::Context<'_>) -> Option { + if line.is_empty() { + return None + } + let ent = Self::search_hist(line,ctx)?; + let entry_raw = ent.get(pos..)?.to_string(); + Some(FernHint::new(entry_raw)) + } +} + +impl Validator for FernReadline { + fn validate(&self, ctx: &mut rustyline::validate::ValidationContext) -> rustyline::Result { + let mut tokens = vec![]; + let tk_stream = LexStream::new(Arc::new(ctx.input().to_string()), LexFlags::empty()); + for tk in tk_stream { + if tk.is_err() { + return Ok(ValidationResult::Incomplete) + } + tokens.push(tk.unwrap()); + } + let nd_stream = ParseStream::new(tokens); + for nd in nd_stream { + if nd.is_err() { + return Ok(ValidationResult::Incomplete) + } + } + Ok(ValidationResult::Valid(None)) + } +} diff --git a/src/shopt.rs b/src/shopt.rs index d9ba848..e5e7480 100644 --- a/src/shopt.rs +++ b/src/shopt.rs @@ -1,6 +1,5 @@ use std::{collections::HashMap, fmt::Display, str::FromStr}; -use rustyline::{config::BellStyle, EditMode}; use crate::{libsh::error::{Note, ShErr, ShErrKind, ShResult}, state::ShFunc}; @@ -29,17 +28,6 @@ impl FromStr for FernBellStyle { } } -impl From for BellStyle { - fn from(val: FernBellStyle) -> Self { - match val { - FernBellStyle::Audible => BellStyle::Audible, - FernBellStyle::Visible => BellStyle::Visible, - FernBellStyle::Disable => BellStyle::None - } - } -} - - impl Display for FernBellStyle { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { @@ -56,15 +44,6 @@ pub enum FernEditMode { Emacs } -impl From for EditMode { - fn from(val: FernEditMode) -> Self { - match val { - FernEditMode::Vi => EditMode::Vi, - FernEditMode::Emacs => EditMode::Emacs - } - } -} - impl FromStr for FernEditMode { type Err = ShErr; fn from_str(s: &str) -> Result { diff --git a/src/tests/highlight.rs b/src/tests/highlight.rs index 71f9653..8b13789 100644 --- a/src/tests/highlight.rs +++ b/src/tests/highlight.rs @@ -1,27 +1 @@ -use insta::assert_snapshot; - -use crate::prompt::highlight::FernHighlighter; - -use super::super::*; - -#[test] -fn highlight_simple() { - let line = "echo foo bar"; - let styled = FernHighlighter::new(line.to_string()).hl_input(); - assert_snapshot!(styled) -} - -#[test] -fn highlight_cmd_sub() { - let line = "echo foo $(echo bar)"; - let styled = FernHighlighter::new(line.to_string()).hl_input(); - assert_snapshot!(styled) -} - -#[test] -fn highlight_cmd_sub_in_dquotes() { - let line = "echo \"foo $(echo bar) biz\""; - let styled = FernHighlighter::new(line.to_string()).hl_input(); - assert_snapshot!(styled) -} From f51dc9e3b850247b3a3a5a2fc79ce009f7060794 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Thu, 15 May 2025 11:54:59 -0400 Subject: [PATCH 02/19] implemented command system --- src/prompt/readline.rs | 245 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 219 insertions(+), 26 deletions(-) diff --git a/src/prompt/readline.rs b/src/prompt/readline.rs index 85d5109..ad13676 100644 --- a/src/prompt/readline.rs +++ b/src/prompt/readline.rs @@ -3,7 +3,7 @@ use std::{arch::asm, os::fd::BorrowedFd}; use nix::{libc::STDIN_FILENO, sys::termios::{self, Termios}, unistd::read}; use unicode_width::UnicodeWidthStr; -use crate::{libsh::error::ShResult, prelude::*}; +use crate::{libsh::{error::ShResult, sys::sh_quit}, prelude::*}; #[derive(Clone,Copy,Debug)] pub enum Key { @@ -19,6 +19,59 @@ pub enum Key { Unknown, } +#[derive(Clone,Debug)] +pub enum EditAction { + Return, + Exit(i32), + ClearTerm, + ClearLine, + Signal(i32), + MoveCursorStart, + MoveCursorEnd, + MoveCursorLeft, // Ctrl + B + MoveCursorRight, // Ctrl + F + DelWordBack, + DelFromCursor, + Backspace, // The Ctrl+H version + RedrawScreen, + HistNext, + HistPrev, + InsMode(InsAction), + NormMode(NormAction), +} + +#[derive(Clone,Debug)] +pub enum InsAction { + InsChar(char), + Backspace, // The backspace version + Delete, + Esc, + MoveLeft, // Left Arrow + MoveRight, // Right Arrow + MoveUp, + MoveDown +} + +#[derive(Clone,Debug)] +pub enum NormAction { + Count(usize), + Motion(Motion), +} + +#[derive(Clone,Debug)] +pub enum Motion { +} + +impl EditAction { + pub fn is_return(&self) -> bool { + if let Self::Return = self { + true + } else { + false + } + } +} + #[derive(Debug)] pub struct Terminal { stdin: RawFd, @@ -123,7 +176,7 @@ pub struct FernReader { pub term: Terminal, pub prompt: String, pub line: LineBuf, - pub editor: EditMode + pub edit_mode: EditMode } impl FernReader { @@ -132,49 +185,176 @@ impl FernReader { term: Terminal::new(), prompt, line: Default::default(), - editor: Default::default() + edit_mode: Default::default() } } - fn pack_line(&self) -> String { + fn pack_line(&mut self) -> String { self.line .buffer .iter() .collect::() } pub fn readline(&mut self) -> ShResult { - self.display_line(false); + self.display_line(/*refresh: */ false); loop { - let key = self.read_key().unwrap(); - self.process_key(key); - self.display_line(true); - if let Key::Enter = key { - self.term.write_bytes(b"\r"); - break + let cmds = self.get_cmds(); + for cmd in &cmds { + if cmd.is_return() { + self.term.write_bytes(b"\r\n"); + return Ok(self.pack_line()) + } + } + self.process_cmds(cmds)?; + self.display_line(/* refresh: */ true); + } + } + pub fn process_cmds(&mut self, cmds: Vec) -> ShResult<()> { + for cmd in cmds { + match cmd { + EditAction::Exit(code) => { + self.term.write_bytes(b"\r\n"); + sh_quit(code) + } + EditAction::ClearTerm => todo!(), + EditAction::ClearLine => todo!(), + EditAction::Signal(sig) => todo!(), + EditAction::MoveCursorStart => self.line.move_cursor_start(), + EditAction::MoveCursorEnd => self.line.move_cursor_end(), + EditAction::MoveCursorLeft => self.line.move_cursor_left(), + EditAction::MoveCursorRight => self.line.move_cursor_right(), + EditAction::DelWordBack => todo!(), + EditAction::DelFromCursor => self.line.del_from_cursor(), + EditAction::Backspace => todo!(), + EditAction::RedrawScreen => todo!(), + EditAction::HistNext => todo!(), + EditAction::HistPrev => todo!(), + EditAction::InsMode(ins_action) => self.process_ins_cmd(ins_action)?, + EditAction::NormMode(norm_action) => self.process_norm_cmd(norm_action)?, + EditAction::Return => unreachable!(), // handled earlier } } - Ok(self.pack_line()) + + Ok(()) } - pub fn process_key(&mut self, key: Key) { + pub fn process_ins_cmd(&mut self, cmd: InsAction) -> ShResult<()> { + match cmd { + InsAction::InsChar(ch) => self.line.insert_at_cursor(ch), + InsAction::Backspace => self.line.backspace_at_cursor(), + InsAction::Delete => todo!(), + InsAction::Esc => todo!(), + InsAction::MoveLeft => self.line.move_cursor_left(), + InsAction::MoveRight => self.line.move_cursor_right(), + InsAction::MoveUp => todo!(), + InsAction::MoveDown => todo!(), + } + Ok(()) + } + pub fn process_norm_cmd(&mut self, cmd: NormAction) -> ShResult<()> { + match cmd { + NormAction::Count(num) => todo!(), + NormAction::Motion(motion) => todo!(), + } + Ok(()) + } + pub fn get_cmds(&mut self) -> Vec { + match self.edit_mode { + EditMode::Normal => todo!(), + EditMode::Insert => { + let key = self.read_key().unwrap(); + self.process_key(key) + } + } + } + pub fn process_key(&mut self, key: Key) -> Vec { + match self.edit_mode { + EditMode::Normal => todo!(), + EditMode::Insert => self.process_key_insert_mode(key) + } + } + pub fn process_key_insert_mode(&mut self, key: Key) -> Vec { match key { Key::Char(ch) => { - self.line.insert_at_cursor(ch); + vec![EditAction::InsMode(InsAction::InsChar(ch))] } Key::Enter => { - self.line.insert_at_cursor('\n'); + vec![EditAction::Return] } - Key::Backspace => self.line.backspace_at_cursor(), - Key::Esc => todo!(), - Key::Up => todo!(), - Key::Down => todo!(), - Key::Left => self.line.move_cursor_left(), - Key::Right => self.line.move_cursor_right(), - Key::Ctrl(ctrl) => todo!(), - Key::Unknown => todo!(), + Key::Backspace => { + vec![EditAction::InsMode(InsAction::Backspace)] + } + Key::Esc => { + vec![EditAction::InsMode(InsAction::Esc)] + } + Key::Up => { + vec![EditAction::InsMode(InsAction::MoveUp)] + } + Key::Down => { + vec![EditAction::InsMode(InsAction::MoveDown)] + } + Key::Left => { + vec![EditAction::InsMode(InsAction::MoveLeft)] + } + Key::Right => { + vec![EditAction::InsMode(InsAction::MoveRight)] + } + Key::Ctrl(ctrl) => self.process_ctrl(ctrl), + Key::Unknown => unimplemented!("Unknown key received: {key:?}") + } + } + pub fn process_ctrl(&mut self, ctrl: char) -> Vec { + match ctrl { + 'D' => { + if self.line.buffer.is_empty() { + vec![EditAction::Exit(0)] + } else { + vec![EditAction::Return] + } + } + 'C' => { + vec![EditAction::ClearLine] + } + 'Z' => { + vec![EditAction::Signal(20)] // SIGTSTP + } + 'A' => { + vec![EditAction::MoveCursorStart] + } + 'E' => { + vec![EditAction::MoveCursorEnd] + } + 'B' => { + vec![EditAction::MoveCursorLeft] + } + 'F' => { + vec![EditAction::MoveCursorRight] + } + 'U' => { + vec![EditAction::ClearLine] + } + 'W' => { + vec![EditAction::DelWordBack] + } + 'K' => { + vec![EditAction::DelFromCursor] + } + 'H' => { + vec![EditAction::Backspace] + } + 'L' => { + vec![EditAction::RedrawScreen] + } + 'N' => { + vec![EditAction::HistNext] + } + 'P' => { + vec![EditAction::HistPrev] + } + _ => unimplemented!("Unhandled control character: {ctrl}") } } fn clear_line(&self) { let prompt_lines = self.prompt.lines().count(); - let buf_lines = self.line.count_lines().saturating_sub(1); // One of the buffer's lines will overlap with the prompt + let buf_lines = self.line.count_lines().saturating_sub(1); // One of the buffer's lines will overlap with the prompt. probably. let total = prompt_lines + buf_lines; self.term.write_bytes(b"\r\n"); for _ in 0..total { @@ -182,7 +362,7 @@ impl FernReader { } self.term.write_bytes(b"\r\x1b[2K"); } - fn display_line(&self, refresh: bool) { + fn display_line(&mut self, refresh: bool) { if refresh { self.clear_line(); } @@ -196,7 +376,8 @@ impl FernReader { self.term.writeln(line); } } - self.term.write(&self.pack_line()); + let line = self.pack_line(); + self.term.write(&line); let cursor_offset = self.line.cursor + last_line_len; self.term.write_bytes(format!("\r\x1b[{}C", cursor_offset).as_bytes()); @@ -267,9 +448,21 @@ impl LineBuf { pub fn move_cursor_left(&mut self) { self.cursor = self.cursor.saturating_sub(1); } + pub fn move_cursor_start(&mut self) { + self.cursor = 0; + } + pub fn move_cursor_end(&mut self) { + self.cursor = self.buffer.len(); + } pub fn move_cursor_right(&mut self) { + if self.cursor == self.buffer.len() { + return + } self.cursor = self.cursor.saturating_add(1); } + pub fn del_from_cursor(&mut self) { + self.buffer.truncate(self.cursor); + } } pub fn strip_ansi_codes(s: &str) -> String { From 73e7c0efc4c1518b2ec68b4d26a7175e356cf009 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Sun, 18 May 2025 14:42:00 -0400 Subject: [PATCH 03/19] split readline into it's own module directory --- src/prompt/readline/line.rs | 99 +++++++++ src/prompt/{readline.rs => readline/mod.rs} | 225 ++++---------------- src/prompt/readline/term.rs | 106 +++++++++ 3 files changed, 245 insertions(+), 185 deletions(-) create mode 100644 src/prompt/readline/line.rs rename src/prompt/{readline.rs => readline/mod.rs} (59%) create mode 100644 src/prompt/readline/term.rs diff --git a/src/prompt/readline/line.rs b/src/prompt/readline/line.rs new file mode 100644 index 0000000..f2c78de --- /dev/null +++ b/src/prompt/readline/line.rs @@ -0,0 +1,99 @@ + +#[derive(Default,Debug)] +pub struct LineBuf { + pub buffer: Vec, + cursor: usize +} + +impl LineBuf { + pub fn new() -> Self { + Self::default() + } + pub fn count_lines(&self) -> usize { + self.buffer.iter().filter(|&&c| c == '\n').count() + } + pub fn cursor(&self) -> usize { + self.cursor + } + pub fn clear(&mut self) { + self.buffer.clear(); + self.cursor = 0; + } + pub fn insert_at_cursor(&mut self, ch: char) { + self.buffer.insert(self.cursor, ch); + self.move_cursor_right(); + } + pub fn backspace_at_cursor(&mut self) { + assert!(self.cursor <= self.buffer.len()); + if self.buffer.is_empty() { + return + } + self.buffer.remove(self.cursor.saturating_sub(1)); + self.move_cursor_left(); + } + pub fn del_at_cursor(&mut self) { + assert!(self.cursor <= self.buffer.len()); + if self.buffer.is_empty() || self.cursor == self.buffer.len() { + return + } + self.buffer.remove(self.cursor); + } + pub fn move_cursor_left(&mut self) { + self.cursor = self.cursor.saturating_sub(1); + } + pub fn move_cursor_start(&mut self) { + self.cursor = 0; + } + pub fn move_cursor_end(&mut self) { + self.cursor = self.buffer.len(); + } + pub fn move_cursor_right(&mut self) { + if self.cursor == self.buffer.len() { + return + } + self.cursor = self.cursor.saturating_add(1); + } + pub fn del_from_cursor(&mut self) { + self.buffer.truncate(self.cursor); + } + pub fn del_word_back(&mut self) { + if self.cursor == 0 { + return + } + let end = self.cursor; + let mut start = self.cursor; + + while start > 0 && self.buffer[start - 1].is_whitespace() { + start -= 1; + } + + while start > 0 && !self.buffer[start - 1].is_whitespace() { + start -= 1; + } + + self.buffer.drain(start..end); + self.cursor = start; + } +} + +pub fn strip_ansi_codes(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + let mut chars = s.chars().peekable(); + + while let Some(c) = chars.next() { + if c == '\x1b' && chars.peek() == Some(&'[') { + // Skip over the escape sequence + chars.next(); // consume '[' + while let Some(&ch) = chars.peek() { + if ch.is_ascii_lowercase() || ch.is_ascii_uppercase() { + chars.next(); // consume final letter + break; + } + chars.next(); // consume intermediate characters + } + } else { + out.push(c); + } + } + out +} diff --git a/src/prompt/readline.rs b/src/prompt/readline/mod.rs similarity index 59% rename from src/prompt/readline.rs rename to src/prompt/readline/mod.rs index ad13676..8fe7c44 100644 --- a/src/prompt/readline.rs +++ b/src/prompt/readline/mod.rs @@ -1,15 +1,20 @@ use std::{arch::asm, os::fd::BorrowedFd}; +use line::{strip_ansi_codes, LineBuf}; use nix::{libc::STDIN_FILENO, sys::termios::{self, Termios}, unistd::read}; +use term::Terminal; use unicode_width::UnicodeWidthStr; use crate::{libsh::{error::ShResult, sys::sh_quit}, prelude::*}; +pub mod term; +pub mod line; #[derive(Clone,Copy,Debug)] pub enum Key { Char(char), Enter, Backspace, + Delete, Esc, Up, Down, @@ -64,112 +69,10 @@ pub enum Motion { impl EditAction { pub fn is_return(&self) -> bool { - if let Self::Return = self { - true - } else { - false - } + matches!(self, Self::Return) } } -#[derive(Debug)] -pub struct Terminal { - stdin: RawFd, - stdout: RawFd, -} - -impl Terminal { - pub fn new() -> Self { - assert!(isatty(0).unwrap()); - Self { - stdin: 0, - stdout: 1, - } - } - fn raw_mode() -> termios::Termios { - // Get the current terminal attributes - let orig_termios = unsafe { termios::tcgetattr(BorrowedFd::borrow_raw(STDIN_FILENO)).expect("Failed to get terminal attributes") }; - - // Make a mutable copy - let mut raw = orig_termios.clone(); - - // Apply raw mode flags - termios::cfmakeraw(&mut raw); - - // Set the attributes immediately - unsafe { termios::tcsetattr(BorrowedFd::borrow_raw(STDIN_FILENO), termios::SetArg::TCSANOW, &raw) } - .expect("Failed to set terminal to raw mode"); - - // Return original attributes so they can be restored later - orig_termios - } - pub fn restore_termios(termios: Termios) { - unsafe { termios::tcsetattr(BorrowedFd::borrow_raw(STDIN_FILENO), termios::SetArg::TCSANOW, &termios) } - .expect("Failed to restore terminal settings"); - } - pub fn with_raw_mode R,R>(func: F) -> R { - let saved = Self::raw_mode(); - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(func)); - Self::restore_termios(saved); - - match result { - Ok(r) => r, - Err(e) => std::panic::resume_unwind(e) - } - } - pub fn read_byte(&self, buf: &mut [u8]) -> usize { - Self::with_raw_mode(|| { - let ret: usize; - unsafe { - let buf_ptr = buf.as_mut_ptr(); - let len = buf.len(); - asm! ( - "syscall", - in("rax") 0, - in("rdi") self.stdin, - in("rsi") buf_ptr, - in("rdx") len, - lateout("rax") ret, - out("rcx") _, - out("r11") _, - ); - } - ret - }) - } - pub fn write_bytes(&self, buf: &[u8]) { - Self::with_raw_mode(|| { - let _ret: usize; - unsafe { - let buf_ptr = buf.as_ptr(); - let len = buf.len(); - asm!( - "syscall", - in("rax") 1, - in("rdi") self.stdout, - in("rsi") buf_ptr, - in("rdx") len, - lateout("rax") _ret, - out("rcx") _, - out("r11") _, - ); - } - }); - } - pub fn write(&self, s: &str) { - self.write_bytes(s.as_bytes()); - } - pub fn writeln(&self, s: &str) { - self.write(s); - self.write_bytes(b"\r\n"); - } -} - -impl Default for Terminal { - fn default() -> Self { - Self::new() - } -} #[derive(Default,Debug)] pub struct FernReader { @@ -215,17 +118,17 @@ impl FernReader { self.term.write_bytes(b"\r\n"); sh_quit(code) } - EditAction::ClearTerm => todo!(), - EditAction::ClearLine => todo!(), + EditAction::ClearTerm => self.term.clear(), + EditAction::ClearLine => self.line.clear(), EditAction::Signal(sig) => todo!(), EditAction::MoveCursorStart => self.line.move_cursor_start(), EditAction::MoveCursorEnd => self.line.move_cursor_end(), EditAction::MoveCursorLeft => self.line.move_cursor_left(), EditAction::MoveCursorRight => self.line.move_cursor_right(), - EditAction::DelWordBack => todo!(), + EditAction::DelWordBack => self.line.del_word_back(), EditAction::DelFromCursor => self.line.del_from_cursor(), - EditAction::Backspace => todo!(), - EditAction::RedrawScreen => todo!(), + EditAction::Backspace => self.line.backspace_at_cursor(), + EditAction::RedrawScreen => self.term.clear(), EditAction::HistNext => todo!(), EditAction::HistPrev => todo!(), EditAction::InsMode(ins_action) => self.process_ins_cmd(ins_action)?, @@ -240,7 +143,7 @@ impl FernReader { match cmd { InsAction::InsChar(ch) => self.line.insert_at_cursor(ch), InsAction::Backspace => self.line.backspace_at_cursor(), - InsAction::Delete => todo!(), + InsAction::Delete => self.line.del_at_cursor(), InsAction::Esc => todo!(), InsAction::MoveLeft => self.line.move_cursor_left(), InsAction::MoveRight => self.line.move_cursor_right(), @@ -258,18 +161,21 @@ impl FernReader { } pub fn get_cmds(&mut self) -> Vec { match self.edit_mode { - EditMode::Normal => todo!(), + EditMode::Normal => { + let keys = self.read_keys_normal_mode(); + self.process_keys_normal_mode(keys) + } EditMode::Insert => { let key = self.read_key().unwrap(); - self.process_key(key) + self.process_key_insert_mode(key) } } } - pub fn process_key(&mut self, key: Key) -> Vec { - match self.edit_mode { - EditMode::Normal => todo!(), - EditMode::Insert => self.process_key_insert_mode(key) - } + pub fn read_keys_normal_mode(&mut self) -> Vec { + todo!() + } + pub fn process_keys_normal_mode(&mut self, keys: Vec) -> Vec { + todo!() } pub fn process_key_insert_mode(&mut self, key: Key) -> Vec { match key { @@ -282,6 +188,9 @@ impl FernReader { Key::Backspace => { vec![EditAction::InsMode(InsAction::Backspace)] } + Key::Delete => { + vec![EditAction::InsMode(InsAction::Delete)] + } Key::Esc => { vec![EditAction::InsMode(InsAction::Esc)] } @@ -379,11 +288,11 @@ impl FernReader { let line = self.pack_line(); self.term.write(&line); - let cursor_offset = self.line.cursor + last_line_len; - self.term.write_bytes(format!("\r\x1b[{}C", cursor_offset).as_bytes()); + let cursor_offset = self.line.cursor() + last_line_len; + self.term.write(&format!("\r\x1b[{}C", cursor_offset)); } fn read_key(&mut self) -> Option { - let mut buf = [0; 3]; + let mut buf = [0; 4]; let n = self.term.read_byte(&mut buf); if n == 0 { @@ -397,7 +306,18 @@ impl FernReader { (b'[', b'B') => Some(Key::Down), (b'[', b'C') => Some(Key::Right), (b'[', b'D') => Some(Key::Left), - _ => Some(Key::Esc), + _ => { + flog!(WARN, "unhandled control seq: {},{}", buf[1] as char, buf[2] as char); + Some(Key::Esc) + } + } + } else if n == 4 { + match (buf[1], buf[2], buf[3]) { + (b'[', b'3', b'~') => Some(Key::Delete), + _ => { + flog!(WARN, "unhandled control seq: {},{},{}", buf[1] as char, buf[2] as char, buf[3] as char); + Some(Key::Esc) + } } } else { Some(Key::Esc) @@ -421,68 +341,3 @@ pub enum EditMode { Insert, } -#[derive(Default,Debug)] -pub struct LineBuf { - buffer: Vec, - cursor: usize -} - -impl LineBuf { - pub fn new() -> Self { - Self::default() - } - pub fn count_lines(&self) -> usize { - self.buffer.iter().filter(|&&c| c == '\n').count() - } - pub fn insert_at_cursor(&mut self, ch: char) { - self.buffer.insert(self.cursor, ch); - self.move_cursor_right(); - } - pub fn backspace_at_cursor(&mut self) { - if self.buffer.is_empty() { - return - } - self.buffer.remove(self.cursor.saturating_sub(1)); - self.move_cursor_left(); - } - pub fn move_cursor_left(&mut self) { - self.cursor = self.cursor.saturating_sub(1); - } - pub fn move_cursor_start(&mut self) { - self.cursor = 0; - } - pub fn move_cursor_end(&mut self) { - self.cursor = self.buffer.len(); - } - pub fn move_cursor_right(&mut self) { - if self.cursor == self.buffer.len() { - return - } - self.cursor = self.cursor.saturating_add(1); - } - pub fn del_from_cursor(&mut self) { - self.buffer.truncate(self.cursor); - } -} - -pub fn strip_ansi_codes(s: &str) -> String { - let mut out = String::with_capacity(s.len()); - let mut chars = s.chars().peekable(); - - while let Some(c) = chars.next() { - if c == '\x1b' && chars.peek() == Some(&'[') { - // Skip over the escape sequence - chars.next(); // consume '[' - while let Some(&ch) = chars.peek() { - if ch.is_ascii_lowercase() || ch.is_ascii_uppercase() { - chars.next(); // consume final letter - break; - } - chars.next(); // consume intermediate characters - } - } else { - out.push(c); - } - } - out -} diff --git a/src/prompt/readline/term.rs b/src/prompt/readline/term.rs new file mode 100644 index 0000000..7398038 --- /dev/null +++ b/src/prompt/readline/term.rs @@ -0,0 +1,106 @@ +use std::{arch::asm, os::fd::{BorrowedFd, RawFd}}; + +use nix::{libc::STDIN_FILENO, sys::termios, unistd::isatty}; + + +#[derive(Debug)] +pub struct Terminal { + stdin: RawFd, + stdout: RawFd, +} + +impl Terminal { + pub fn new() -> Self { + assert!(isatty(0).unwrap()); + Self { + stdin: 0, + stdout: 1, + } + } + fn raw_mode() -> termios::Termios { + // Get the current terminal attributes + let orig_termios = unsafe { termios::tcgetattr(BorrowedFd::borrow_raw(STDIN_FILENO)).expect("Failed to get terminal attributes") }; + + // Make a mutable copy + let mut raw = orig_termios.clone(); + + // Apply raw mode flags + termios::cfmakeraw(&mut raw); + + // Set the attributes immediately + unsafe { termios::tcsetattr(BorrowedFd::borrow_raw(STDIN_FILENO), termios::SetArg::TCSANOW, &raw) } + .expect("Failed to set terminal to raw mode"); + + // Return original attributes so they can be restored later + orig_termios + } + pub fn restore_termios(termios: termios::Termios) { + unsafe { termios::tcsetattr(BorrowedFd::borrow_raw(STDIN_FILENO), termios::SetArg::TCSANOW, &termios) } + .expect("Failed to restore terminal settings"); + } + pub fn with_raw_mode R,R>(func: F) -> R { + let saved = Self::raw_mode(); + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(func)); + Self::restore_termios(saved); + + match result { + Ok(r) => r, + Err(e) => std::panic::resume_unwind(e) + } + } + pub fn read_byte(&self, buf: &mut [u8]) -> usize { + Self::with_raw_mode(|| { + let ret: usize; + unsafe { + let buf_ptr = buf.as_mut_ptr(); + let len = buf.len(); + asm! ( + "syscall", + in("rax") 0, + in("rdi") self.stdin, + in("rsi") buf_ptr, + in("rdx") len, + lateout("rax") ret, + out("rcx") _, + out("r11") _, + ); + } + ret + }) + } + pub fn write_bytes(&self, buf: &[u8]) { + Self::with_raw_mode(|| { + let _ret: usize; + unsafe { + let buf_ptr = buf.as_ptr(); + let len = buf.len(); + asm!( + "syscall", + in("rax") 1, + in("rdi") self.stdout, + in("rsi") buf_ptr, + in("rdx") len, + lateout("rax") _ret, + out("rcx") _, + out("r11") _, + ); + } + }); + } + pub fn write(&self, s: &str) { + self.write_bytes(s.as_bytes()); + } + pub fn writeln(&self, s: &str) { + self.write(s); + self.write_bytes(b"\r\n"); + } + pub fn clear(&self) { + self.write_bytes(b"\x1b[2J\x1b[H"); + } +} + +impl Default for Terminal { + fn default() -> Self { + Self::new() + } +} From 56f674415c99f4bc4c7010bbda84229d36e95bae Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Sun, 18 May 2025 14:50:31 -0400 Subject: [PATCH 04/19] added snapshots to gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b84a4f9..07e8e81 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ target .idea *.iml /result* -src/tests/snapshots +*snapshots* *.log default.nix shell.nix From 1b2fa49458c59fd1d1fff9d9d16f5b14ef7592e1 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Sun, 18 May 2025 14:52:01 -0400 Subject: [PATCH 05/19] forgot snapshot files in git history --- .../fern__tests__error__case_no_esac.snap | 10 - .../fern__tests__error__case_no_in.snap | 10 - .../fern__tests__error__cmd_not_found.snap | 9 - .../fern__tests__error__error_with_notes.snap | 8 - ...error__error_with_notes_and_sub_notes.snap | 11 - .../fern__tests__error__if_no_fi.snap | 10 - .../fern__tests__error__if_no_then.snap | 10 - .../fern__tests__error__loop_no_do.snap | 10 - .../fern__tests__error__loop_no_done.snap | 10 - .../fern__tests__error__unclosed_brc_grp.snap | 10 - .../fern__tests__error__unclosed_dquote.snap | 10 - .../fern__tests__error__unclosed_squote.snap | 10 - .../fern__tests__error__unclosed_subsh.snap | 10 - ...fern__tests__expand__simple_expansion.snap | 13 - .../fern__tests__expand__unescape_string.snap | 5 - ...rn__tests__getopt__getopt_from_argv-2.snap | 12 - ...fern__tests__getopt__getopt_from_argv.snap | 26 - ...ests__getopt__getopt_multiple_short-2.snap | 15 - ..._tests__getopt__getopt_multiple_short.snap | 8 - .../fern__tests__getopt__getopt_simple-2.snap | 9 - .../fern__tests__getopt__getopt_simple.snap | 8 - .../fern__tests__lexer__lex_case.snap | 186 - .../fern__tests__lexer__lex_multiline.snap | 162 - .../fern__tests__lexer__lex_quote_str.snap | 78 - .../fern__tests__lexer__lex_redir.snap | 78 - .../fern__tests__lexer__lex_redir_fds.snap | 66 - .../fern__tests__lexer__lex_simple.snap | 66 - ...fern__tests__lexer__lex_with_keywords.snap | 126 - .../fern__tests__parser__node_operation.snap | 162 - ...__tests__parser__parse_case_multiline.snap | 595 - ...ern__tests__parser__parse_case_nested.snap | 3975 ---- ...ern__tests__parser__parse_case_simple.snap | 575 - ...ern__tests__parser__parse_conjunction.snap | 248 - ...arser__parse_conjunction_and_pipeline.snap | 826 - .../fern__tests__parser__parse_cursed.snap | 15563 ---------------- ...fern__tests__parser__parse_final_boss.snap | 4516 ----- ...rn__tests__parser__parse_if_multiline.snap | 1094 -- ...tests__parser__parse_if_multiple_elif.snap | 1034 - .../fern__tests__parser__parse_if_redirs.snap | 435 - .../fern__tests__parser__parse_if_simple.snap | 382 - ...rn__tests__parser__parse_if_with_elif.snap | 708 - ...__tests__parser__parse_loop_multiline.snap | 350 - ...ern__tests__parser__parse_loop_simple.snap | 330 - ...fern__tests__parser__parse_loop_until.snap | 330 - .../fern__tests__parser__parse_multiline.snap | 555 - .../fern__tests__parser__parse_pipeline.snap | 242 - .../fern__tests__parser__parse_simple.snap | 169 - .../fern__tests__term__styled_background.snap | 5 - .../fern__tests__term__styled_multiple.snap | 5 - .../fern__tests__term__styled_reset.snap | 5 - .../fern__tests__term__styled_rgb.snap | 5 - .../fern__tests__term__styled_set.snap | 5 - .../fern__tests__term__styled_simple.snap | 5 - 53 files changed, 33105 deletions(-) delete mode 100644 src/tests/snapshots/fern__tests__error__case_no_esac.snap delete mode 100644 src/tests/snapshots/fern__tests__error__case_no_in.snap delete mode 100644 src/tests/snapshots/fern__tests__error__cmd_not_found.snap delete mode 100644 src/tests/snapshots/fern__tests__error__error_with_notes.snap delete mode 100644 src/tests/snapshots/fern__tests__error__error_with_notes_and_sub_notes.snap delete mode 100644 src/tests/snapshots/fern__tests__error__if_no_fi.snap delete mode 100644 src/tests/snapshots/fern__tests__error__if_no_then.snap delete mode 100644 src/tests/snapshots/fern__tests__error__loop_no_do.snap delete mode 100644 src/tests/snapshots/fern__tests__error__loop_no_done.snap delete mode 100644 src/tests/snapshots/fern__tests__error__unclosed_brc_grp.snap delete mode 100644 src/tests/snapshots/fern__tests__error__unclosed_dquote.snap delete mode 100644 src/tests/snapshots/fern__tests__error__unclosed_squote.snap delete mode 100644 src/tests/snapshots/fern__tests__error__unclosed_subsh.snap delete mode 100644 src/tests/snapshots/fern__tests__expand__simple_expansion.snap delete mode 100644 src/tests/snapshots/fern__tests__expand__unescape_string.snap delete mode 100644 src/tests/snapshots/fern__tests__getopt__getopt_from_argv-2.snap delete mode 100644 src/tests/snapshots/fern__tests__getopt__getopt_from_argv.snap delete mode 100644 src/tests/snapshots/fern__tests__getopt__getopt_multiple_short-2.snap delete mode 100644 src/tests/snapshots/fern__tests__getopt__getopt_multiple_short.snap delete mode 100644 src/tests/snapshots/fern__tests__getopt__getopt_simple-2.snap delete mode 100644 src/tests/snapshots/fern__tests__getopt__getopt_simple.snap delete mode 100644 src/tests/snapshots/fern__tests__lexer__lex_case.snap delete mode 100644 src/tests/snapshots/fern__tests__lexer__lex_multiline.snap delete mode 100644 src/tests/snapshots/fern__tests__lexer__lex_quote_str.snap delete mode 100644 src/tests/snapshots/fern__tests__lexer__lex_redir.snap delete mode 100644 src/tests/snapshots/fern__tests__lexer__lex_redir_fds.snap delete mode 100644 src/tests/snapshots/fern__tests__lexer__lex_simple.snap delete mode 100644 src/tests/snapshots/fern__tests__lexer__lex_with_keywords.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__node_operation.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_case_multiline.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_case_nested.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_case_simple.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_conjunction.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_conjunction_and_pipeline.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_cursed.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_final_boss.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_if_multiline.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_if_multiple_elif.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_if_redirs.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_if_simple.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_if_with_elif.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_loop_multiline.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_loop_simple.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_loop_until.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_multiline.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_pipeline.snap delete mode 100644 src/tests/snapshots/fern__tests__parser__parse_simple.snap delete mode 100644 src/tests/snapshots/fern__tests__term__styled_background.snap delete mode 100644 src/tests/snapshots/fern__tests__term__styled_multiple.snap delete mode 100644 src/tests/snapshots/fern__tests__term__styled_reset.snap delete mode 100644 src/tests/snapshots/fern__tests__term__styled_rgb.snap delete mode 100644 src/tests/snapshots/fern__tests__term__styled_set.snap delete mode 100644 src/tests/snapshots/fern__tests__term__styled_simple.snap diff --git a/src/tests/snapshots/fern__tests__error__case_no_esac.snap b/src/tests/snapshots/fern__tests__error__case_no_esac.snap deleted file mode 100644 index b53486a..0000000 --- a/src/tests/snapshots/fern__tests__error__case_no_esac.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Expected 'esac' after case block - -> [1;1] - | -1 | case foo in foo) bar;; bar) foo;; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__case_no_in.snap b/src/tests/snapshots/fern__tests__error__case_no_in.snap deleted file mode 100644 index b1d3435..0000000 --- a/src/tests/snapshots/fern__tests__error__case_no_in.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Expected 'in' after case variable name - -> [1;1] - | -1 | case foo foo) bar;; bar) foo;; esac - | ^^^^^^^^^^^^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__cmd_not_found.snap b/src/tests/snapshots/fern__tests__error__cmd_not_found.snap deleted file mode 100644 index 05085be..0000000 --- a/src/tests/snapshots/fern__tests__error__cmd_not_found.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Command not found: foo - - -> [1;1] - | -1 | foo - | diff --git a/src/tests/snapshots/fern__tests__error__error_with_notes.snap b/src/tests/snapshots/fern__tests__error__error_with_notes.snap deleted file mode 100644 index 2d2af50..0000000 --- a/src/tests/snapshots/fern__tests__error__error_with_notes.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Execution failed -note: Execution failed for this reason - -note: Here is how to fix it: blah blah blah diff --git a/src/tests/snapshots/fern__tests__error__error_with_notes_and_sub_notes.snap b/src/tests/snapshots/fern__tests__error__error_with_notes_and_sub_notes.snap deleted file mode 100644 index 75594b6..0000000 --- a/src/tests/snapshots/fern__tests__error__error_with_notes_and_sub_notes.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Execution failed -note: Execution failed for this reason - -note: Here is how to fix it: - - blah - - blah - - blah diff --git a/src/tests/snapshots/fern__tests__error__if_no_fi.snap b/src/tests/snapshots/fern__tests__error__if_no_fi.snap deleted file mode 100644 index 1932844..0000000 --- a/src/tests/snapshots/fern__tests__error__if_no_fi.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Expected 'fi' after if statement - -> [1;1] - | -1 | if foo; then bar; - | ^^^^^^^^^^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__if_no_then.snap b/src/tests/snapshots/fern__tests__error__if_no_then.snap deleted file mode 100644 index 7ea9a5d..0000000 --- a/src/tests/snapshots/fern__tests__error__if_no_then.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Expected 'then' after 'if' condition - -> [1;1] - | -1 | if foo; bar; fi - | ^^^^^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__loop_no_do.snap b/src/tests/snapshots/fern__tests__error__loop_no_do.snap deleted file mode 100644 index 4fccbfc..0000000 --- a/src/tests/snapshots/fern__tests__error__loop_no_do.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Expected 'do' after loop condition - -> [1;1] - | -1 | while true; echo foo; done - | ^^^^^^^^^^^^^^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__loop_no_done.snap b/src/tests/snapshots/fern__tests__error__loop_no_done.snap deleted file mode 100644 index 6f46636..0000000 --- a/src/tests/snapshots/fern__tests__error__loop_no_done.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Expected 'done' after loop body - -> [1;1] - | -1 | while true; do echo foo; - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__unclosed_brc_grp.snap b/src/tests/snapshots/fern__tests__error__unclosed_brc_grp.snap deleted file mode 100644 index cd2bffd..0000000 --- a/src/tests/snapshots/fern__tests__error__unclosed_brc_grp.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Expected a closing brace for this brace group - -> [1;1] - | -1 | { foo bar - | ^^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__unclosed_dquote.snap b/src/tests/snapshots/fern__tests__error__unclosed_dquote.snap deleted file mode 100644 index bb18194..0000000 --- a/src/tests/snapshots/fern__tests__error__unclosed_dquote.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Unterminated quote - -> [1;1] - | -1 | "foo bar - | ^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__unclosed_squote.snap b/src/tests/snapshots/fern__tests__error__unclosed_squote.snap deleted file mode 100644 index d121112..0000000 --- a/src/tests/snapshots/fern__tests__error__unclosed_squote.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Unterminated quote - -> [1;1] - | -1 | 'foo bar - | ^^^^^^^^ - | diff --git a/src/tests/snapshots/fern__tests__error__unclosed_subsh.snap b/src/tests/snapshots/fern__tests__error__unclosed_subsh.snap deleted file mode 100644 index 79d7af3..0000000 --- a/src/tests/snapshots/fern__tests__error__unclosed_subsh.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: src/tests/error.rs -expression: err_fmt ---- -Parse Error - Unclosed subshell - -> [1;2] - | -1 | (foo - | ^ - | diff --git a/src/tests/snapshots/fern__tests__expand__simple_expansion.snap b/src/tests/snapshots/fern__tests__expand__simple_expansion.snap deleted file mode 100644 index 63e9278..0000000 --- a/src/tests/snapshots/fern__tests__expand__simple_expansion.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: src/tests/expand.rs -expression: exp_tk.get_words() ---- -[ - "this", - "is", - "the", - "value", - "of", - "the", - "variable", -] diff --git a/src/tests/snapshots/fern__tests__expand__unescape_string.snap b/src/tests/snapshots/fern__tests__expand__unescape_string.snap deleted file mode 100644 index 43bdbd8..0000000 --- a/src/tests/snapshots/fern__tests__expand__unescape_string.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/tests/expand.rs -expression: unescaped ---- -echo ﷐foo $bar diff --git a/src/tests/snapshots/fern__tests__getopt__getopt_from_argv-2.snap b/src/tests/snapshots/fern__tests__getopt__getopt_from_argv-2.snap deleted file mode 100644 index 4314c4a..0000000 --- a/src/tests/snapshots/fern__tests__getopt__getopt_from_argv-2.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: src/tests/getopt.rs -expression: opts ---- -[ - Short( - 'n', - ), - Short( - 'e', - ), -] diff --git a/src/tests/snapshots/fern__tests__getopt__getopt_from_argv.snap b/src/tests/snapshots/fern__tests__getopt__getopt_from_argv.snap deleted file mode 100644 index 4b51fdb..0000000 --- a/src/tests/snapshots/fern__tests__getopt__getopt_from_argv.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: src/tests/getopt.rs -expression: words ---- -[ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo -n -e foo", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo -n -e foo", - }, - flags: TkFlags( - 0x0, - ), - }, -] diff --git a/src/tests/snapshots/fern__tests__getopt__getopt_multiple_short-2.snap b/src/tests/snapshots/fern__tests__getopt__getopt_multiple_short-2.snap deleted file mode 100644 index 1a46305..0000000 --- a/src/tests/snapshots/fern__tests__getopt__getopt_multiple_short-2.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: src/tests/getopt.rs -expression: opts ---- -[ - Short( - 'n', - ), - Short( - 'r', - ), - Short( - 'e', - ), -] diff --git a/src/tests/snapshots/fern__tests__getopt__getopt_multiple_short.snap b/src/tests/snapshots/fern__tests__getopt__getopt_multiple_short.snap deleted file mode 100644 index 98bb71f..0000000 --- a/src/tests/snapshots/fern__tests__getopt__getopt_multiple_short.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: src/tests/getopt.rs -expression: words ---- -[ - "echo", - "foo", -] diff --git a/src/tests/snapshots/fern__tests__getopt__getopt_simple-2.snap b/src/tests/snapshots/fern__tests__getopt__getopt_simple-2.snap deleted file mode 100644 index fd6335c..0000000 --- a/src/tests/snapshots/fern__tests__getopt__getopt_simple-2.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: src/tests/getopt.rs -expression: opts ---- -[ - Short( - 'n', - ), -] diff --git a/src/tests/snapshots/fern__tests__getopt__getopt_simple.snap b/src/tests/snapshots/fern__tests__getopt__getopt_simple.snap deleted file mode 100644 index 98bb71f..0000000 --- a/src/tests/snapshots/fern__tests__getopt__getopt_simple.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: src/tests/getopt.rs -expression: words ---- -[ - "echo", - "foo", -] diff --git a/src/tests/snapshots/fern__tests__lexer__lex_case.snap b/src/tests/snapshots/fern__tests__lexer__lex_case.snap deleted file mode 100644 index 713bb49..0000000 --- a/src/tests/snapshots/fern__tests__lexer__lex_case.snap +++ /dev/null @@ -1,186 +0,0 @@ ---- -source: src/tests/lexer.rs -expression: tokens ---- -[ - Ok( - Tk { - class: SOI, - span: Span { - range: 0..0, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 0..4, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 5..9, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 10..12, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ), - Ok( - Tk { - class: CasePattern, - span: Span { - range: 13..17, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 18..21, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ), - Ok( - Tk { - class: Sep, - span: Span { - range: 21..24, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: CasePattern, - span: Span { - range: 24..28, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 29..32, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ), - Ok( - Tk { - class: Sep, - span: Span { - range: 32..35, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: CasePattern, - span: Span { - range: 35..39, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 40..43, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ), - Ok( - Tk { - class: Sep, - span: Span { - range: 43..46, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 46..50, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ), - Ok( - Tk { - class: EOI, - span: Span { - range: 50..50, - source: "case $foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__lexer__lex_multiline.snap b/src/tests/snapshots/fern__tests__lexer__lex_multiline.snap deleted file mode 100644 index 8aedcc7..0000000 --- a/src/tests/snapshots/fern__tests__lexer__lex_multiline.snap +++ /dev/null @@ -1,162 +0,0 @@ ---- -source: src/tests/lexer.rs -expression: tokens ---- -[ - Ok( - Tk { - class: SOI, - span: Span { - range: 0..0, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 5..10, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 11..16, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Sep, - span: Span { - range: 16..17, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 17..21, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 22..25, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 26..29, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Sep, - span: Span { - range: 29..30, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 30..34, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 35..38, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 39..42, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: EOI, - span: Span { - range: 42..42, - source: "echo hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__lexer__lex_quote_str.snap b/src/tests/snapshots/fern__tests__lexer__lex_quote_str.snap deleted file mode 100644 index 44f7a93..0000000 --- a/src/tests/snapshots/fern__tests__lexer__lex_quote_str.snap +++ /dev/null @@ -1,78 +0,0 @@ ---- -source: src/tests/lexer.rs -expression: tokens ---- -[ - Ok( - Tk { - class: SOI, - span: Span { - range: 0..0, - source: "echo \"foo bar\" biz baz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo \"foo bar\" biz baz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 5..14, - source: "echo \"foo bar\" biz baz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 15..18, - source: "echo \"foo bar\" biz baz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 19..22, - source: "echo \"foo bar\" biz baz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: EOI, - span: Span { - range: 22..22, - source: "echo \"foo bar\" biz baz", - }, - flags: TkFlags( - 0x0, - ), - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__lexer__lex_redir.snap b/src/tests/snapshots/fern__tests__lexer__lex_redir.snap deleted file mode 100644 index 1bbb910..0000000 --- a/src/tests/snapshots/fern__tests__lexer__lex_redir.snap +++ /dev/null @@ -1,78 +0,0 @@ ---- -source: src/tests/lexer.rs -expression: tokens ---- -[ - Ok( - Tk { - class: SOI, - span: Span { - range: 0..0, - source: "echo foo > bar.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo > bar.txt", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo > bar.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Redir, - span: Span { - range: 9..10, - source: "echo foo > bar.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 11..18, - source: "echo foo > bar.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: EOI, - span: Span { - range: 18..18, - source: "echo foo > bar.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__lexer__lex_redir_fds.snap b/src/tests/snapshots/fern__tests__lexer__lex_redir_fds.snap deleted file mode 100644 index 22cd61b..0000000 --- a/src/tests/snapshots/fern__tests__lexer__lex_redir_fds.snap +++ /dev/null @@ -1,66 +0,0 @@ ---- -source: src/tests/lexer.rs -expression: tokens ---- -[ - Ok( - Tk { - class: SOI, - span: Span { - range: 0..0, - source: "echo foo 1>&2", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo 1>&2", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo 1>&2", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Redir, - span: Span { - range: 9..13, - source: "echo foo 1>&2", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: EOI, - span: Span { - range: 13..13, - source: "echo foo 1>&2", - }, - flags: TkFlags( - 0x0, - ), - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__lexer__lex_simple.snap b/src/tests/snapshots/fern__tests__lexer__lex_simple.snap deleted file mode 100644 index 789426a..0000000 --- a/src/tests/snapshots/fern__tests__lexer__lex_simple.snap +++ /dev/null @@ -1,66 +0,0 @@ ---- -source: src/tests/lexer.rs -expression: tokens ---- -[ - Ok( - Tk { - class: SOI, - span: Span { - range: 0..0, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo hello world", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 5..10, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 11..16, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: EOI, - span: Span { - range: 16..16, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__lexer__lex_with_keywords.snap b/src/tests/snapshots/fern__tests__lexer__lex_with_keywords.snap deleted file mode 100644 index 529071b..0000000 --- a/src/tests/snapshots/fern__tests__lexer__lex_with_keywords.snap +++ /dev/null @@ -1,126 +0,0 @@ ---- -source: src/tests/lexer.rs -expression: tokens ---- -[ - Ok( - Tk { - class: SOI, - span: Span { - range: 0..0, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 3..7, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ), - Ok( - Tk { - class: Sep, - span: Span { - range: 7..9, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 9..13, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 14..18, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 19..22, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Sep, - span: Span { - range: 22..24, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ), - Ok( - Tk { - class: Str, - span: Span { - range: 24..26, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ), - Ok( - Tk { - class: EOI, - span: Span { - range: 26..26, - source: "if true; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__node_operation.snap b/src/tests/snapshots/fern__tests__parser__node_operation.snap deleted file mode 100644 index f1f46d5..0000000 --- a/src/tests/snapshots/fern__tests__parser__node_operation.snap +++ /dev/null @@ -1,162 +0,0 @@ ---- -source: src/tests/parser.rs -expression: check_nodes ---- -[ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..10, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..16, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..10, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..16, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 16..18, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 18..22, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..26, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 27..30, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 18..22, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..26, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 27..30, - source: "echo hello world; echo foo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_case_multiline.snap b/src/tests/snapshots/fern__tests__parser__parse_case_multiline.snap deleted file mode 100644 index 65849b8..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_case_multiline.snap +++ /dev/null @@ -1,595 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 13..17, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 18..21, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 18..21, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..27, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 18..21, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..27, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 27..31, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 32..35, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 32..35, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 35..41, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 32..35, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 35..41, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 41..45, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 46..49, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 46..49, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 49..54, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 46..49, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 49..54, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 11..13, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 13..17, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..27, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 27..31, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..35, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 35..41, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 41..45, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 46..49, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 49..54, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 54..58, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 11..13, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 13..17, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..27, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 27..31, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..35, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 35..41, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 41..45, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 46..49, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 49..54, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 54..58, - source: "case foo in\n\tfoo) bar\n\t;;\n\tbar) foo\n\t;;\n\tbiz) baz\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_case_nested.snap b/src/tests/snapshots/fern__tests__parser__parse_case_nested.snap deleted file mode 100644 index c93e8bf..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_case_nested.snap +++ /dev/null @@ -1,3975 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 13..17, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 23..27, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 23..27, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 27..29, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 23..27, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 27..29, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: While, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 43..47, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 43..47, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 43..47, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 56..60, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 61..64, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 56..60, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 61..64, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..68, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 56..60, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 61..64, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..68, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 37..42, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..56, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 56..60, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 61..64, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..68, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..72, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 72..75, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 20..22, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..27, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 27..29, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..33, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 33..37, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 37..42, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..56, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 56..60, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 61..64, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..68, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..72, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 72..75, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 75..77, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 77..83, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 83..87, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 93..98, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 93..98, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..100, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 93..98, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..100, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 114..119, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 114..119, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 119..121, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 114..119, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 119..121, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 133..136, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 145..149, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 163..165, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 163..165, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 185..192, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 185..192, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 156..158, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 163..165, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 165..169, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 169..177, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 185..192, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 192..194, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 194..208, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 208..212, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 227..229, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 227..229, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 249..256, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 249..256, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 219..221, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 227..229, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 229..233, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 233..241, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 249..256, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 256..258, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 258..271, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 128..132, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 133..136, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 137..139, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 139..145, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 145..149, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 149..156, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 156..158, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 163..165, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 165..169, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 169..177, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 185..192, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 192..194, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 194..208, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 208..212, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 212..219, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 219..221, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 227..229, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 229..233, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 233..241, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 249..256, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 256..258, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 258..271, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 271..275, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 275..279, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 108..113, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 114..119, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 119..121, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 121..123, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 123..128, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 128..132, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 133..136, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 137..139, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 139..145, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 145..149, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 149..156, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 156..158, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 163..165, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 165..169, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 169..177, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 185..192, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 192..194, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 194..208, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 208..212, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 212..219, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 219..221, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 227..229, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 229..233, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 233..241, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 249..256, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 256..258, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 258..271, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 271..275, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 275..279, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 279..283, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 283..286, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 90..92, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 93..98, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..100, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 100..104, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 104..108, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 108..113, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 114..119, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 119..121, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 121..123, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 123..128, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 128..132, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 133..136, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 137..139, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 139..145, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 145..149, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 149..156, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 156..158, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 163..165, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 165..169, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 169..177, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 185..192, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 192..194, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 194..208, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 208..212, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 212..219, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 219..221, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 227..229, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 229..233, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 233..241, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 249..256, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 256..258, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 258..271, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 271..275, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 275..279, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 279..283, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 283..286, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 286..288, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 288..293, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 11..13, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 13..17, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..20, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..22, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..27, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 27..29, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..33, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 33..37, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 37..42, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..56, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 56..60, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 61..64, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..68, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..72, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 72..75, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 75..77, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 77..83, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 83..87, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 87..90, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 90..92, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 93..98, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..100, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 100..104, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 104..108, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 108..113, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 114..119, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 119..121, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 121..123, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 123..128, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 128..132, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 133..136, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 137..139, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 139..145, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 145..149, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 149..156, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 156..158, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 163..165, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 165..169, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 169..177, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 185..192, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 192..194, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 194..208, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 208..212, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 212..219, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 219..221, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 227..229, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 229..233, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 233..241, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 249..256, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 256..258, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 258..271, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 271..275, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 275..279, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 279..283, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 283..286, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 286..288, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 288..293, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 293..297, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 11..13, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 13..17, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..20, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..22, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..27, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 27..29, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..33, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 33..37, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 37..42, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..56, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 56..60, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 61..64, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..68, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..72, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 72..75, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 75..77, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 77..83, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 83..87, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 87..90, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 90..92, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 93..98, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..100, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 100..104, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 104..108, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 108..113, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 114..119, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 119..121, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 121..123, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 123..128, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 128..132, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 133..136, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 137..139, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 139..145, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 145..149, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 149..156, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 156..158, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 159..163, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 163..165, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 165..169, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 169..177, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 177..181, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 182..185, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 185..192, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 192..194, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 194..208, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 208..212, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 212..219, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 219..221, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 222..227, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 227..229, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 229..233, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 233..241, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..245, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 246..249, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 249..256, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 256..258, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 258..271, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 271..275, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 275..279, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 279..283, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 283..286, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 286..288, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 288..293, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 293..297, - source: "case foo in\n\tfoo)\n\t\tif true; then\n\t\t\twhile true; do\n\t\t\t\techo foo\n\t\t\tdone\n\t\tfi\n\t;;\n\tbar)\n\t\tif false; then\n\t\t\tuntil false; do\n\t\t\t\tcase foo in\n\t\t\t\t\tfoo)\n\t\t\t\t\t\tif true; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\t\tbar)\n\t\t\t\t\t\tif false; then\n\t\t\t\t\t\t\techo foo\n\t\t\t\t\t\tfi\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\tdone\n\t\tfi\n\t;;\nesac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_case_simple.snap b/src/tests/snapshots/fern__tests__parser__parse_case_simple.snap deleted file mode 100644 index 7549e1e..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_case_simple.snap +++ /dev/null @@ -1,575 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 12..16, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 17..20, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 17..20, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 20..23, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 17..20, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 20..23, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 23..27, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..34, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..34, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 34..38, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 39..42, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 39..42, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 42..45, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 39..42, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 42..45, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 12..16, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 20..23, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 23..27, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 28..31, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..34, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 34..38, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 39..42, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 42..45, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 45..49, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 12..16, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 20..23, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 23..27, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 28..31, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..34, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 34..38, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 39..42, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 42..45, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 45..49, - source: "case foo in foo) bar;; bar) foo;; biz) baz;; esac", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_conjunction.snap b/src/tests/snapshots/fern__tests__parser__parse_conjunction.snap deleted file mode 100644 index e36d989..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_conjunction.snap +++ /dev/null @@ -1,248 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo && echo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo && echo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo && echo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: And, - }, - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 12..16, - source: "echo foo && echo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 12..16, - source: "echo foo && echo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 12..16, - source: "echo foo && echo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo && echo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: And, - span: Span { - range: 9..11, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..16, - source: "echo foo && echo bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "echo foo && echo bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_conjunction_and_pipeline.snap b/src/tests/snapshots/fern__tests__parser__parse_conjunction_and_pipeline.snap deleted file mode 100644 index 6b69cee..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_conjunction_and_pipeline.snap +++ /dev/null @@ -1,826 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..25, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..25, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Pipe, - span: Span { - range: 9..10, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..25, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: And, - }, - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 29..33, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 34..37, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 29..33, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 34..37, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 40..43, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 44..54, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 40..43, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 44..54, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 29..33, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 34..37, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Pipe, - span: Span { - range: 38..39, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 40..43, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 44..54, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Or, - }, - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 58..62, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 63..66, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 67..70, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 58..62, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 63..66, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 67..70, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 73..76, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 77..82, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 83..90, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 91..95, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 73..76, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 77..82, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 83..90, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 91..95, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 58..62, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 63..66, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 67..70, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Pipe, - span: Span { - range: 71..72, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 73..76, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 77..82, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 83..90, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 91..95, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Pipe, - span: Span { - range: 9..10, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..25, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: And, - span: Span { - range: 26..28, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..33, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 34..37, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Pipe, - span: Span { - range: 38..39, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 40..43, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 44..54, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Or, - span: Span { - range: 55..57, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 58..62, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 63..66, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 67..70, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Pipe, - span: Span { - range: 71..72, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 73..76, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 77..82, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 83..90, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 91..95, - source: "echo foo | sed s/foo/bar/ && echo bar | sed s/bar/foo/ || echo foo bar | sed s/foo bar/bar foo/", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_cursed.snap b/src/tests/snapshots/fern__tests__parser__parse_cursed.snap deleted file mode 100644 index eee90ed..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_cursed.snap +++ /dev/null @@ -1,15563 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 17..20, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 24..28, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 29..31, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..54, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 12..16, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 21..23, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 24..28, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..31, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..54, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 54..58, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 70..73, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 77..81, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 82..87, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..96, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 103..107, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 107..110, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 65..69, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 70..73, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 74..76, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 77..81, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..87, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..96, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 103..107, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 107..110, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..114, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 114..116, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 9..11, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..16, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 21..23, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 24..28, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..31, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..54, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 54..58, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 60..64, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 65..69, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 70..73, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 74..76, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 77..81, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..87, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..96, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 103..107, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 107..110, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..114, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 114..116, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 116..118, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 118..120, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 139..142, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 146..150, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 139..142, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 143..145, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 146..150, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 158..162, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 162..164, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 169..171, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..182, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 189..191, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 191..193, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 131..133, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 139..142, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 143..145, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 146..150, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 158..162, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 162..164, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 164..168, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 169..171, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..182, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 189..191, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 191..193, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 193..195, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 195..197, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 206..211, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 218..220, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..231, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 231..233, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 241..244, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 248..252, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 236..240, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..244, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 245..247, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 248..252, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 260..264, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 264..266, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 200..205, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 206..211, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 218..220, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..231, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 231..233, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 233..235, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 236..240, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..244, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 245..247, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 248..252, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 260..264, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 264..266, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 266..270, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 270..272, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 125..130, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 131..133, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 139..142, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 143..145, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 146..150, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 158..162, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 162..164, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 164..168, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 169..171, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..182, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 189..191, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 191..193, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 193..195, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 195..197, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 197..199, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 200..205, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 206..211, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 218..220, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..231, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 231..233, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 233..235, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 236..240, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..244, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 245..247, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 248..252, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 260..264, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 264..266, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 266..270, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 270..272, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 272..276, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 276..278, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 6..8, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..16, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 21..23, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 24..28, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..31, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..54, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 54..58, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 60..64, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 65..69, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 70..73, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 74..76, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 77..81, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..87, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..96, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 103..107, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 107..110, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..114, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 114..116, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 116..118, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 118..120, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 120..124, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 125..130, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 131..133, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 139..142, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 143..145, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 146..150, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 158..162, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 162..164, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 164..168, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 169..171, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..182, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 189..191, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 191..193, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 193..195, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 195..197, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 197..199, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 200..205, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 206..211, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 218..220, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..231, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 231..233, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 233..235, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 236..240, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..244, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 245..247, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 248..252, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 260..264, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 264..266, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 266..270, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 270..272, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 272..276, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 276..278, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 278..280, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 280..282, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 304..307, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 311..315, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 320..323, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 320..323, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 299..303, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 304..307, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 308..310, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 311..315, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 320..323, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 323..327, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 327..329, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 339..341, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 339..341, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 350..352, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 350..352, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 332..334, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 339..341, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 341..345, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 350..352, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 352..354, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 354..356, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 293..298, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 299..303, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 304..307, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 308..310, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 311..315, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 320..323, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 323..327, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 327..329, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 329..331, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 332..334, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 339..341, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 341..345, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 350..352, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 352..354, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 354..356, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 356..360, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 360..362, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 371..375, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 371..375, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 375..377, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 371..375, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 375..377, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 380..384, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 380..384, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 384..386, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 380..384, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 384..386, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 365..370, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 371..375, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 375..377, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 377..379, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 380..384, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 384..386, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 386..390, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 390..392, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 287..292, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 293..298, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 299..303, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 304..307, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 308..310, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 311..315, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 320..323, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 323..327, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 327..329, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 329..331, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 332..334, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 339..341, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 341..345, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 350..352, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 352..354, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 354..356, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 356..360, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 360..362, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 362..364, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 365..370, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 371..375, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 375..377, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 377..379, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 380..384, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 384..386, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 386..390, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 390..392, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 392..396, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 396..398, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..5, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..8, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..16, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 21..23, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 24..28, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..31, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..54, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 54..58, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 60..64, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 65..69, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 70..73, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 74..76, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 77..81, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..87, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..96, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 103..107, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 107..110, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..114, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 114..116, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 116..118, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 118..120, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 120..124, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 125..130, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 131..133, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 139..142, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 143..145, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 146..150, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 158..162, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 162..164, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 164..168, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 169..171, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..182, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 189..191, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 191..193, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 193..195, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 195..197, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 197..199, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 200..205, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 206..211, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 218..220, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..231, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 231..233, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 233..235, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 236..240, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..244, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 245..247, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 248..252, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 260..264, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 264..266, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 266..270, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 270..272, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 272..276, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 276..278, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 278..280, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 280..282, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 282..286, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 287..292, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 293..298, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 299..303, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 304..307, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 308..310, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 311..315, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 320..323, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 323..327, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 327..329, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 329..331, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 332..334, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 339..341, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 341..345, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 350..352, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 352..354, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 354..356, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 356..360, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 360..362, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 362..364, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 365..370, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 371..375, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 375..377, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 377..379, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 380..384, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 384..386, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 386..390, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 390..392, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 392..396, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 396..398, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 398..400, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 400..402, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 418..421, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 425..429, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 435..438, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 442..446, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 447..451, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 447..451, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 451..454, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 447..451, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 451..454, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 430..434, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 435..438, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 439..441, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 442..446, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 447..451, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 451..454, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 454..458, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 458..461, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 413..417, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 418..421, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 422..424, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 425..429, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 430..434, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 435..438, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 439..441, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 442..446, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 447..451, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 451..454, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 454..458, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 458..461, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 461..465, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 465..467, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 476..480, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 476..480, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 480..482, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 476..480, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 480..482, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 487..491, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 487..491, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 491..493, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 487..491, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 491..493, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 473..475, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 476..480, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 480..482, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 482..486, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 487..491, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 491..493, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 493..495, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 495..497, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 508..512, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 508..512, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 512..514, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 508..512, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 512..514, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 517..521, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 517..521, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 521..523, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 517..521, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 521..523, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 502..507, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 508..512, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 512..514, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 514..516, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 517..521, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 521..523, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 523..527, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 527..529, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 470..472, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 473..475, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 476..480, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 480..482, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 482..486, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 487..491, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 491..493, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 493..495, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 495..497, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 497..501, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 502..507, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 508..512, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 512..514, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 514..516, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 517..521, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 521..523, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 523..527, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 527..529, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 529..531, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 531..533, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 407..412, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 413..417, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 418..421, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 422..424, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 425..429, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 430..434, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 435..438, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 439..441, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 442..446, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 447..451, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 451..454, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 454..458, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 458..461, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 461..465, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 465..467, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 467..469, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 470..472, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 473..475, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 476..480, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 480..482, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 482..486, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 487..491, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 491..493, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 493..495, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 495..497, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 497..501, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 502..507, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 508..512, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 512..514, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 514..516, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 517..521, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 521..523, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 523..527, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 527..529, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 529..531, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 531..533, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 533..537, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 537..539, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CondNode { - cond: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 561..564, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 568..572, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 573..577, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 573..577, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 577..580, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 573..577, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 577..580, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 556..560, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 561..564, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 565..567, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 568..572, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 573..577, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 577..580, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 580..584, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 584..586, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 592..596, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 592..596, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 596..598, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 592..596, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 596..598, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 603..607, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 603..607, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 607..609, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 603..607, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 607..609, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 589..591, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 592..596, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 596..598, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 598..602, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 603..607, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 607..609, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 609..611, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 611..613, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 550..555, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 556..560, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 561..564, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 565..567, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 568..572, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 573..577, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 577..580, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 580..584, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 584..586, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 586..588, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 589..591, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 592..596, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 596..598, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 598..602, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 603..607, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 607..609, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 609..611, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 611..613, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 613..617, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 617..619, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 627..630, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 634..638, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 645..649, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 645..649, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 649..651, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 645..649, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 649..651, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 654..658, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 654..658, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 658..660, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 654..658, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 658..660, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 639..644, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 645..649, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 649..651, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 651..653, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 654..658, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 658..660, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 660..664, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 664..667, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 622..626, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 627..630, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 631..633, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 634..638, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 639..644, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 645..649, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 649..651, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 651..653, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 654..658, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 658..660, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 660..664, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 664..667, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 667..671, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 671..673, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 544..549, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 550..555, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 556..560, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 561..564, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 565..567, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 568..572, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 573..577, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 577..580, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 580..584, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 584..586, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 586..588, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 589..591, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 592..596, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 596..598, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 598..602, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 603..607, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 607..609, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 609..611, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 611..613, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 613..617, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 617..619, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 619..621, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 622..626, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 627..630, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 631..633, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 634..638, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 639..644, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 645..649, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 649..651, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 651..653, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 654..658, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 658..660, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 660..664, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 664..667, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 667..671, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 671..673, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 673..677, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 677..679, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 689..692, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 696..700, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 709..712, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 716..720, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 721..725, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 721..725, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 725..728, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 721..725, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 725..728, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 704..708, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 709..712, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 713..715, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 716..720, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 721..725, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 725..728, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 728..732, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 732..734, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 742..746, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 742..746, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 746..748, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 742..746, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 746..748, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 753..757, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 753..757, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 757..759, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 753..757, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 757..759, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 739..741, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 742..746, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 746..748, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 748..752, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 753..757, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 757..759, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 759..761, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 761..763, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 701..703, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 704..708, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 709..712, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 713..715, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 716..720, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 721..725, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 725..728, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 728..732, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 732..734, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 734..738, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 739..741, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 742..746, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 746..748, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 748..752, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 753..757, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 757..759, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 759..761, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 761..763, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 763..765, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 765..768, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 684..688, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 689..692, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 693..695, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 696..700, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 701..703, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 704..708, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 709..712, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 713..715, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 716..720, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 721..725, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 725..728, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 728..732, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 732..734, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 734..738, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 739..741, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 742..746, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 746..748, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 748..752, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 753..757, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 757..759, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 759..761, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 761..763, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 763..765, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 765..768, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 768..772, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 772..774, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 784..787, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 791..795, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 808..812, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 808..812, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 812..814, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 808..812, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 812..814, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 817..821, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 817..821, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 821..823, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 817..821, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 821..823, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 802..807, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 808..812, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 812..814, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 814..816, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 817..821, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 821..823, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 823..827, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 827..829, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 837..840, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 844..848, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 849..853, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 849..853, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 853..856, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 849..853, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 853..856, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 832..836, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 837..840, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 841..843, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 844..848, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 849..853, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 853..856, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 856..860, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 860..862, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 796..801, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 802..807, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 808..812, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 812..814, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 814..816, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 817..821, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 821..823, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 823..827, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 827..829, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 829..831, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 832..836, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 837..840, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 841..843, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 844..848, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 849..853, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 853..856, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 856..860, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 860..862, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 862..866, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 866..869, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 779..783, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 784..787, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 788..790, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 791..795, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 796..801, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 802..807, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 808..812, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 812..814, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 814..816, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 817..821, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 821..823, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 823..827, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 827..829, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 829..831, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 832..836, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 837..840, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 841..843, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 844..848, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 849..853, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 853..856, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 856..860, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 860..862, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 862..866, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 866..869, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 869..873, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 873..875, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..5, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..8, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..16, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 21..23, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 24..28, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..31, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..54, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 54..58, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 60..64, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 65..69, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 70..73, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 74..76, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 77..81, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..87, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..96, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 103..107, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 107..110, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..114, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 114..116, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 116..118, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 118..120, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 120..124, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 125..130, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 131..133, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 139..142, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 143..145, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 146..150, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 158..162, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 162..164, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 164..168, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 169..171, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..182, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 189..191, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 191..193, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 193..195, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 195..197, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 197..199, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 200..205, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 206..211, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 218..220, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..231, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 231..233, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 233..235, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 236..240, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..244, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 245..247, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 248..252, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 260..264, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 264..266, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 266..270, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 270..272, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 272..276, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 276..278, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 278..280, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 280..282, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 282..286, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 287..292, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 293..298, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 299..303, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 304..307, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 308..310, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 311..315, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 320..323, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 323..327, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 327..329, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 329..331, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 332..334, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 339..341, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 341..345, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 350..352, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 352..354, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 354..356, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 356..360, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 360..362, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 362..364, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 365..370, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 371..375, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 375..377, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 377..379, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 380..384, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 384..386, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 386..390, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 390..392, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 392..396, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 396..398, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 398..400, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 400..402, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 402..406, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 407..412, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 413..417, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 418..421, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 422..424, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 425..429, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 430..434, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 435..438, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 439..441, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 442..446, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 447..451, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 451..454, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 454..458, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 458..461, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 461..465, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 465..467, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 467..469, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 470..472, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 473..475, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 476..480, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 480..482, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 482..486, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 487..491, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 491..493, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 493..495, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 495..497, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 497..501, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 502..507, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 508..512, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 512..514, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 514..516, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 517..521, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 521..523, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 523..527, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 527..529, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 529..531, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 531..533, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 533..537, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 537..539, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 539..543, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 544..549, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 550..555, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 556..560, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 561..564, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 565..567, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 568..572, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 573..577, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 577..580, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 580..584, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 584..586, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 586..588, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 589..591, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 592..596, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 596..598, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 598..602, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 603..607, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 607..609, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 609..611, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 611..613, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 613..617, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 617..619, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 619..621, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 622..626, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 627..630, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 631..633, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 634..638, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 639..644, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 645..649, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 649..651, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 651..653, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 654..658, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 658..660, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 660..664, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 664..667, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 667..671, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 671..673, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 673..677, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 677..679, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 679..683, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 684..688, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 689..692, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 693..695, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 696..700, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 701..703, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 704..708, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 709..712, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 713..715, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 716..720, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 721..725, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 725..728, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 728..732, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 732..734, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 734..738, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 739..741, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 742..746, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 746..748, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 748..752, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 753..757, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 757..759, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 759..761, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 761..763, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 763..765, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 765..768, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 768..772, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 772..774, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 774..778, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 875..877, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..5, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..8, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..11, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..16, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 17..20, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 21..23, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 24..28, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..31, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 32..36, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 36..38, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..47, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 47..49, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 49..51, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 51..54, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 54..58, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 60..64, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 65..69, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 70..73, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 74..76, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 77..81, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..87, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 88..92, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 92..94, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..96, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 97..101, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 101..103, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 103..107, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 107..110, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..114, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 114..116, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 116..118, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 118..120, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 120..124, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 125..130, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 131..133, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 139..142, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 143..145, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 146..150, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..155, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 155..158, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 158..162, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 162..164, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 164..168, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 169..171, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..182, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 183..187, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 187..189, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 189..191, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 191..193, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 193..195, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 195..197, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 197..199, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 200..205, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 206..211, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 212..216, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 216..218, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 218..220, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 221..225, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 225..227, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..231, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 231..233, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 233..235, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 236..240, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 241..244, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 245..247, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 248..252, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..260, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 260..264, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 264..266, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 266..270, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 270..272, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 272..276, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 276..278, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 278..280, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 280..282, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 282..286, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 287..292, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 293..298, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 299..303, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 304..307, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 308..310, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 311..315, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 316..320, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 320..323, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 323..327, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 327..329, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 329..331, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 332..334, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 335..339, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 339..341, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 341..345, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 346..350, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 350..352, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 352..354, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 354..356, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 356..360, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 360..362, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 362..364, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 365..370, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 371..375, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 375..377, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 377..379, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 380..384, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 384..386, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 386..390, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 390..392, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 392..396, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 396..398, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 398..400, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 400..402, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 402..406, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 407..412, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 413..417, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 418..421, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 422..424, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 425..429, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 430..434, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 435..438, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 439..441, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 442..446, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 447..451, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 451..454, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 454..458, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 458..461, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 461..465, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 465..467, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 467..469, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 470..472, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 473..475, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 476..480, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 480..482, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 482..486, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 487..491, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 491..493, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 493..495, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 495..497, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 497..501, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 502..507, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 508..512, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 512..514, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 514..516, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 517..521, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 521..523, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 523..527, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 527..529, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 529..531, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 531..533, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 533..537, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 537..539, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 539..543, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 544..549, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 550..555, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 556..560, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 561..564, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 565..567, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 568..572, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 573..577, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 577..580, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 580..584, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 584..586, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 586..588, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 589..591, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 592..596, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 596..598, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 598..602, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 603..607, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 607..609, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 609..611, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 611..613, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 613..617, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 617..619, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 619..621, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 622..626, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 627..630, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 631..633, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 634..638, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 639..644, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 645..649, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 649..651, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 651..653, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 654..658, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 658..660, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 660..664, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 664..667, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 667..671, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 671..673, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 673..677, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 677..679, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 679..683, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 684..688, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 689..692, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 693..695, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 696..700, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 701..703, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 704..708, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 709..712, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 713..715, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 716..720, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 721..725, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 725..728, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 728..732, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 732..734, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 734..738, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 739..741, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 742..746, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 746..748, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 748..752, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 753..757, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 757..759, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 759..761, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 761..763, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 763..765, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 765..768, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 768..772, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 772..774, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 774..778, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 875..877, - source: "if if if if case foo in foo) if true; then true; fi;; esac; then case foo in foo) until true; do true; done;; esac; fi; then until if case foo in foo) true;; esac; then if true; then true; fi; fi; do until until true; do true; done; do case foo in foo) true;; esac; done; done; fi; then until until case foo in foo) true;; esac; do if true; then true; fi; done; do until true; do true; done; done; fi; then until case foo in foo) case foo in foo) true;; esac;; esac; do if if true; then true; fi; then until true; do true; done; fi; done; elif until until case foo in foo) true;; esac; do if true; then true; fi; done; do case foo in foo) until true; do true; done;; esac; done; then case foo in foo) if case foo in foo) true;; esac; then if true; then true; fi; fi;; esac; else case foo in foo) until until true; do true; done; do case foo in foo) true;; esac; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_final_boss.snap b/src/tests/snapshots/fern__tests__parser__parse_final_boss.snap deleted file mode 100644 index 8aa88f6..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_final_boss.snap +++ /dev/null @@ -1,4516 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 9..13, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 9..13, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 13..15, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 9..13, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 13..15, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 20..24, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 20..24, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 24..26, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 20..24, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 24..26, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 6..8, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..13, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 13..15, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..19, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..24, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 24..26, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 26..28, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 28..30, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 41..45, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 41..45, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 45..47, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 41..45, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 45..47, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 50..54, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 50..54, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 54..56, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 50..54, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 54..56, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 35..40, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 41..45, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 45..47, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 47..49, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 50..54, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 54..56, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 56..60, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 60..62, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..5, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..8, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..13, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 13..15, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..19, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..24, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 24..26, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 26..28, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 28..30, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 30..34, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 35..40, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 41..45, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 45..47, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 47..49, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 50..54, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 54..56, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 56..60, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 60..62, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 62..64, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..66, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 82..85, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 89..93, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 94..98, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 94..98, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..101, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 94..98, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..101, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 77..81, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..85, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 86..88, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 89..93, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..98, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..101, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 101..105, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 105..107, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 113..117, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 113..117, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 117..119, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 113..117, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 117..119, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 124..128, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 124..128, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 128..130, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 124..128, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 128..130, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 110..112, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 113..117, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 117..119, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 119..123, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 124..128, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 128..130, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 130..132, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 132..134, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 71..76, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 77..81, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..85, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 86..88, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 89..93, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..98, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..101, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 101..105, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 105..107, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 107..109, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..112, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 113..117, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 117..119, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 119..123, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 124..128, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 128..130, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 130..132, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 132..134, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 138..140, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CondNode { - cond: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 157..161, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 157..161, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 161..163, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 157..161, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 161..163, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 166..170, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 166..170, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 170..172, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 166..170, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 170..172, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 151..156, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 157..161, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 161..163, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 163..165, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 166..170, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 170..172, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 186..189, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 193..197, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 198..202, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 198..202, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 202..205, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 198..202, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 202..205, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 181..185, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 186..189, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 190..192, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 193..197, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 198..202, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 202..205, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 205..209, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 209..211, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 145..150, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..156, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 157..161, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 161..163, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 163..165, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 166..170, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 170..172, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..180, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 181..185, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 186..189, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 190..192, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 193..197, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 198..202, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 202..205, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 205..209, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 209..211, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 211..215, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 215..217, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 227..230, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 234..238, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 242..246, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 242..246, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 246..248, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 242..246, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 246..248, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..259, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..259, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 239..241, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 242..246, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 246..248, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 248..252, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..259, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 259..261, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 261..264, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 222..226, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..230, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 231..233, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 234..238, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 239..241, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 242..246, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 246..248, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 248..252, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..259, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 259..261, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 261..264, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 264..268, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 268..270, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [ - Node { - class: CaseNode { - pattern: Tk { - class: Str, - span: Span { - range: 280..283, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - case_blocks: [ - CaseNode { - pattern: Tk { - class: CasePattern, - span: Span { - range: 287..291, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - body: [ - Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 298..302, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 298..302, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 302..304, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 298..302, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 302..304, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 307..311, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 307..311, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 311..313, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 307..311, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 311..313, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 292..297, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 298..302, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 302..304, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 304..306, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 307..311, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 311..313, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 313..317, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 317..320, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 275..279, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 280..283, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 284..286, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 287..291, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 292..297, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 298..302, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 302..304, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 304..306, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 307..311, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 311..313, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 313..317, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 317..320, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 320..324, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 324..326, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..5, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..8, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..13, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 13..15, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..19, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..24, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 24..26, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 26..28, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 28..30, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 30..34, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 35..40, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 41..45, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 45..47, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 47..49, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 50..54, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 54..56, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 56..60, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 60..62, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 62..64, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..66, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 66..70, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 71..76, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 77..81, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..85, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 86..88, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 89..93, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..98, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..101, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 101..105, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 105..107, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 107..109, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..112, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 113..117, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 117..119, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 119..123, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 124..128, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 128..130, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 130..132, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 132..134, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 138..140, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 140..144, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 145..150, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..156, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 157..161, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 161..163, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 163..165, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 166..170, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 170..172, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..180, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 181..185, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 186..189, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 190..192, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 193..197, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 198..202, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 202..205, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 205..209, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 209..211, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 211..215, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 215..217, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 217..221, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 222..226, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..230, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 231..233, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 234..238, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 239..241, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 242..246, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 246..248, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 248..252, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..259, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 259..261, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 261..264, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 264..268, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 268..270, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 270..274, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 326..328, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..5, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..8, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..13, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 13..15, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..19, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..24, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 24..26, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 26..28, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 28..30, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 30..34, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 35..40, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 41..45, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 45..47, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 47..49, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 50..54, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 54..56, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 56..60, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 60..62, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 62..64, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..66, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 66..70, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 71..76, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 77..81, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 82..85, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 86..88, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 89..93, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 94..98, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 98..101, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 101..105, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 105..107, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 107..109, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 110..112, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 113..117, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 117..119, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 119..123, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 124..128, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 128..130, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 130..132, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 132..134, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 134..138, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 138..140, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 140..144, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 145..150, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 151..156, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 157..161, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 161..163, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 163..165, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 166..170, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 170..172, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 172..176, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 176..178, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 178..180, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 181..185, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 186..189, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 190..192, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 193..197, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 198..202, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 202..205, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 205..209, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 209..211, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 211..215, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 215..217, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 217..221, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 222..226, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 227..230, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 231..233, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: CasePattern, - span: Span { - range: 234..238, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 239..241, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 242..246, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 246..248, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 248..252, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 253..257, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 257..259, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 259..261, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 261..264, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 264..268, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 268..270, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 270..274, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 326..328, - source: "if if if true; then true; fi; then until true; do true; done; fi; then until case foo in foo) true;; esac; do if true; then true; fi; done; elif until until true; do true; done; do case foo in foo) true;; esac; done; then case foo in foo) if true; then true; fi;; esac; else case foo in foo) until true; do true; done;; esac; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_if_multiline.snap b/src/tests/snapshots/fern__tests__parser__parse_if_multiline.snap deleted file mode 100644 index 1aa2098..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_if_multiline.snap +++ /dev/null @@ -1,1094 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 4..7, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 4..7, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 7..9, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 4..7, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 7..9, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 15..19, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..23, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 15..19, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..23, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 23..24, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 15..19, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..23, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 23..24, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 29..32, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 29..32, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 32..34, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 29..32, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 32..34, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 40..44, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 45..48, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 40..44, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 45..48, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 48..50, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 40..44, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 45..48, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 48..50, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 55..58, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 55..58, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 55..58, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 66..70, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 71..74, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 66..70, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 71..74, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 74..75, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 66..70, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 71..74, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 74..75, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 1..3, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 4..7, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 7..9, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..13, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 13..15, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..19, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..23, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 23..24, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 24..28, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..32, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 32..34, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 34..38, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 38..40, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 40..44, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 45..48, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 48..50, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 50..54, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 55..58, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 60..64, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..66, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 66..70, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 71..74, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 74..75, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 75..77, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 1..3, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 4..7, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 7..9, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 9..13, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 13..15, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..19, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..23, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 23..24, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 24..28, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 29..32, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 32..34, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 34..38, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 38..40, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 40..44, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 45..48, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 48..50, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 50..54, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 55..58, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 58..60, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 60..64, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 64..66, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 66..70, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 71..74, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 74..75, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 75..77, - source: "\nif foo; then\n\techo bar\nelif bar; then\n\techo foo;\nelif biz; then\n\techo baz\nfi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_if_multiple_elif.snap b/src/tests/snapshots/fern__tests__parser__parse_if_multiple_elif.snap deleted file mode 100644 index d08d577..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_if_multiple_elif.snap +++ /dev/null @@ -1,1034 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..33, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..33, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 46..48, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 46..48, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 53..56, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 53..56, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 56..58, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 53..56, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 56..58, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 63..67, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..71, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 63..67, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..71, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 71..73, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 63..67, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..71, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 71..73, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 8..12, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..27, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..33, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 33..37, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 46..48, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 48..52, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 53..56, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 56..58, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 58..62, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 63..67, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..71, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 71..73, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 73..75, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 8..12, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..27, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..33, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 33..37, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 46..48, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 48..52, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 53..56, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 56..58, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 58..62, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 63..67, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 68..71, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 71..73, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 73..75, - source: "if foo; then echo bar; elif bar; then echo foo; elif biz; then echo baz; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_if_redirs.snap b/src/tests/snapshots/fern__tests__parser__parse_if_redirs.snap deleted file mode 100644 index 4421ab3..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_if_redirs.snap +++ /dev/null @@ -1,435 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [ - Redir { - io_mode: File { - tgt_fd: 1, - file: File { - fd: 3, - path: "/home/pagedmov/Coding/projects/rust/fern/file.txt", - read: false, - write: true, - }, - }, - class: Output, - }, - ], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 8..12, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..25, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Redir, - span: Span { - range: 26..27, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 28..36, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 8..12, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..25, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Redir, - span: Span { - range: 26..27, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 28..36, - source: "if foo; then echo bar; fi > file.txt", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_if_simple.snap b/src/tests/snapshots/fern__tests__parser__parse_if_simple.snap deleted file mode 100644 index 07f6c26..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_if_simple.snap +++ /dev/null @@ -1,382 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 8..12, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..25, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 8..12, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..25, - source: "if foo; then echo bar; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_if_with_elif.snap b/src/tests/snapshots/fern__tests__parser__parse_if_with_elif.snap deleted file mode 100644 index 73c47e6..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_if_with_elif.snap +++ /dev/null @@ -1,708 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: IfNode { - cond_nodes: [ - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..33, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..33, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 46..48, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 46..48, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - ], - else_block: [], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 8..12, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..27, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..33, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 33..37, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 46..48, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 48..50, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..2, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 3..6, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 6..8, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 8..12, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 13..17, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 18..21, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 21..23, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..27, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 28..31, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 31..33, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 33..37, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 38..42, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 43..46, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 46..48, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 48..50, - source: "if foo; then echo bar; elif bar; then echo foo; fi", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_loop_multiline.snap b/src/tests/snapshots/fern__tests__parser__parse_loop_multiline.snap deleted file mode 100644 index a1b4507..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_loop_multiline.snap +++ /dev/null @@ -1,350 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 7..10, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 7..10, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 10..12, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 7..10, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 10..12, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 16..19, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 16..19, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 19..20, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 16..19, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 19..20, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 1..6, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 7..10, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 10..12, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..14, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 14..16, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 16..19, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 19..20, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..24, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 1..6, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 7..10, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 10..12, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..14, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 14..16, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 16..19, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 19..20, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 20..24, - source: "\nuntil foo; do\n\tbar\ndone", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_loop_simple.snap b/src/tests/snapshots/fern__tests__parser__parse_loop_simple.snap deleted file mode 100644 index 7685408..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_loop_simple.snap +++ /dev/null @@ -1,330 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: LoopNode { - kind: While, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 6..9, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 6..9, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 9..11, - source: "while foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 6..9, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 9..11, - source: "while foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 14..17, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 14..17, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..19, - source: "while foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 14..17, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..19, - source: "while foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..5, - source: "while foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..9, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 9..11, - source: "while foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..13, - source: "while foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 14..17, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..19, - source: "while foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 19..23, - source: "while foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..5, - source: "while foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..9, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 9..11, - source: "while foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..13, - source: "while foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 14..17, - source: "while foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..19, - source: "while foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 19..23, - source: "while foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_loop_until.snap b/src/tests/snapshots/fern__tests__parser__parse_loop_until.snap deleted file mode 100644 index 1f1df75..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_loop_until.snap +++ /dev/null @@ -1,330 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: LoopNode { - kind: Until, - cond_node: CondNode { - cond: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 6..9, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 6..9, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 9..11, - source: "until foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 6..9, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 9..11, - source: "until foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - body: [ - Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 14..17, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 14..17, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..19, - source: "until foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 14..17, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..19, - source: "until foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - }, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..5, - source: "until foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..9, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 9..11, - source: "until foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..13, - source: "until foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 14..17, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..19, - source: "until foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 19..23, - source: "until foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..5, - source: "until foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..9, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 9..11, - source: "until foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..13, - source: "until foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - Tk { - class: Str, - span: Span { - range: 14..17, - source: "until foo; do bar; done", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..19, - source: "until foo; do bar; done", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 19..23, - source: "until foo; do bar; done", - }, - flags: TkFlags( - KEYWORD, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_multiline.snap b/src/tests/snapshots/fern__tests__parser__parse_multiline.snap deleted file mode 100644 index 827de79..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_multiline.snap +++ /dev/null @@ -1,555 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 1..5, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..11, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..17, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 1..5, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..11, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..17, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..18, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 1..5, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..11, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..17, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..18, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 1..5, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 6..11, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 12..17, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 17..18, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ), - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 18..22, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..26, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 27..30, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 18..22, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..26, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 27..30, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 30..31, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 18..22, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..26, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 27..30, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 30..31, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 18..22, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 23..26, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 27..30, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Sep, - span: Span { - range: 30..31, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ), - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 31..35, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 36..39, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 40..43, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 31..35, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 36..39, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 40..43, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 31..35, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 36..39, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 40..43, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 31..35, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 36..39, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 40..43, - source: "\necho hello world\necho foo bar\necho boo biz", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_pipeline.snap b/src/tests/snapshots/fern__tests__parser__parse_pipeline.snap deleted file mode 100644 index 903ec77..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_pipeline.snap +++ /dev/null @@ -1,242 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..24, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..24, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Pipe, - span: Span { - range: 9..10, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..24, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..8, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Pipe, - span: Span { - range: 9..10, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..14, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - IS_CMD, - ), - }, - Tk { - class: Str, - span: Span { - range: 15..24, - source: "echo foo | sed s/foo/bar", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__parser__parse_simple.snap b/src/tests/snapshots/fern__tests__parser__parse_simple.snap deleted file mode 100644 index b25f498..0000000 --- a/src/tests/snapshots/fern__tests__parser__parse_simple.snap +++ /dev/null @@ -1,169 +0,0 @@ ---- -source: src/tests/parser.rs -expression: nodes ---- -[ - Ok( - Node { - class: Conjunction { - elements: [ - ConjunctNode { - cmd: Node { - class: Pipeline { - cmds: [ - Node { - class: Command { - assignments: [], - argv: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo hello world", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..10, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..16, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo hello world", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..10, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..16, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ], - pipe_err: false, - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo hello world", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..10, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..16, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - operator: Null, - }, - ], - }, - flags: NdFlags( - 0x0, - ), - redirs: [], - tokens: [ - Tk { - class: Str, - span: Span { - range: 0..4, - source: "echo hello world", - }, - flags: TkFlags( - IS_CMD | BUILTIN, - ), - }, - Tk { - class: Str, - span: Span { - range: 5..10, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - Tk { - class: Str, - span: Span { - range: 11..16, - source: "echo hello world", - }, - flags: TkFlags( - 0x0, - ), - }, - ], - }, - ), -] diff --git a/src/tests/snapshots/fern__tests__term__styled_background.snap b/src/tests/snapshots/fern__tests__term__styled_background.snap deleted file mode 100644 index 5281567..0000000 --- a/src/tests/snapshots/fern__tests__term__styled_background.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/tests/term.rs -expression: styled ---- -text with background diff --git a/src/tests/snapshots/fern__tests__term__styled_multiple.snap b/src/tests/snapshots/fern__tests__term__styled_multiple.snap deleted file mode 100644 index 4d950bb..0000000 --- a/src/tests/snapshots/fern__tests__term__styled_multiple.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/tests/term.rs -expression: styled ---- -styled text diff --git a/src/tests/snapshots/fern__tests__term__styled_reset.snap b/src/tests/snapshots/fern__tests__term__styled_reset.snap deleted file mode 100644 index 2f68687..0000000 --- a/src/tests/snapshots/fern__tests__term__styled_reset.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/tests/term.rs -expression: styled ---- -reset test diff --git a/src/tests/snapshots/fern__tests__term__styled_rgb.snap b/src/tests/snapshots/fern__tests__term__styled_rgb.snap deleted file mode 100644 index f739e99..0000000 --- a/src/tests/snapshots/fern__tests__term__styled_rgb.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/tests/term.rs -expression: styled ---- -RGB styled text diff --git a/src/tests/snapshots/fern__tests__term__styled_set.snap b/src/tests/snapshots/fern__tests__term__styled_set.snap deleted file mode 100644 index 71e00bc..0000000 --- a/src/tests/snapshots/fern__tests__term__styled_set.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/tests/term.rs -expression: styled ---- -multi-style text diff --git a/src/tests/snapshots/fern__tests__term__styled_simple.snap b/src/tests/snapshots/fern__tests__term__styled_simple.snap deleted file mode 100644 index daf3595..0000000 --- a/src/tests/snapshots/fern__tests__term__styled_simple.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/tests/term.rs -expression: styled ---- -hello world From 4af31ba8efefbed706234e8f35fbfcace00e6ac6 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Mon, 19 May 2025 00:03:50 -0400 Subject: [PATCH 06/19] Reduced the amount of time that file redirections stay open --- src/parse/mod.rs | 155 +++++++++++------------------------------------ src/procio.rs | 29 ++++++--- 2 files changed, 56 insertions(+), 128 deletions(-) diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 8eb27d8..902ee3c 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -716,43 +716,7 @@ impl ParseStream { } if !from_func_def { - while self.check_redir() { - let tk = self.next_tk().unwrap(); - node_tks.push(tk.clone()); - let redir_bldr = tk.span.as_str().parse::().unwrap(); - if redir_bldr.io_mode.is_none() { - let path_tk = self.next_tk(); - - if path_tk.clone().is_none_or(|tk| tk.class == TkRule::EOI) { - return Err( - ShErr::full( - ShErrKind::ParseErr, - "Expected a filename after this redirection", - tk.span.clone() - ) - ) - }; - - let path_tk = path_tk.unwrap(); - node_tks.push(path_tk.clone()); - let redir_class = redir_bldr.class.unwrap(); - let pathbuf = PathBuf::from(path_tk.span.as_str()); - - let Ok(file) = get_redir_file(redir_class, pathbuf) else { - self.panic_mode(&mut node_tks); - return Err(parse_err_full( - "Error opening file for redirection", - &path_tk.span - ) - ); - }; - - let io_mode = IoMode::file(redir_bldr.tgt_fd.unwrap(), file); - let redir_bldr = redir_bldr.with_io_mode(io_mode); - let redir = redir_bldr.build(); - redirs.push(redir); - } - } + self.parse_redir(&mut redirs, &mut node_tks)?; } let node = Node { @@ -763,6 +727,37 @@ impl ParseStream { }; Ok(Some(node)) } + fn parse_redir(&mut self, redirs: &mut Vec, node_tks: &mut Vec) -> ShResult<()> { + while self.check_redir() { + let tk = self.next_tk().unwrap(); + node_tks.push(tk.clone()); + let redir_bldr = tk.span.as_str().parse::().unwrap(); + if redir_bldr.io_mode.is_none() { + let path_tk = self.next_tk(); + + if path_tk.clone().is_none_or(|tk| tk.class == TkRule::EOI) { + return Err( + ShErr::full( + ShErrKind::ParseErr, + "Expected a filename after this redirection", + tk.span.clone() + ) + ) + }; + + let path_tk = path_tk.unwrap(); + node_tks.push(path_tk.clone()); + let redir_class = redir_bldr.class.unwrap(); + let pathbuf = PathBuf::from(path_tk.span.as_str()); + + let io_mode = IoMode::file(redir_bldr.tgt_fd.unwrap(), pathbuf, redir_class); + let redir_bldr = redir_bldr.with_io_mode(io_mode); + let redir = redir_bldr.build(); + redirs.push(redir); + } + } + Ok(()) + } fn parse_case(&mut self) -> ShResult> { // Needs a pattern token // Followed by any number of CaseNodes @@ -938,42 +933,7 @@ impl ParseStream { } node_tks.push(self.next_tk().unwrap()); - while self.check_redir() { - let tk = self.next_tk().unwrap(); - node_tks.push(tk.clone()); - let redir_bldr = tk.span.as_str().parse::().unwrap(); - if redir_bldr.io_mode.is_none() { - let path_tk = self.next_tk(); - - if path_tk.clone().is_none_or(|tk| tk.class == TkRule::EOI) { - return Err( - ShErr::full( - ShErrKind::ParseErr, - "Expected a filename after this redirection", - tk.span.clone() - ) - ) - }; - - let path_tk = path_tk.unwrap(); - node_tks.push(path_tk.clone()); - let redir_class = redir_bldr.class.unwrap(); - let pathbuf = PathBuf::from(path_tk.span.as_str()); - - let Ok(file) = get_redir_file(redir_class, pathbuf) else { - self.panic_mode(&mut node_tks); - return Err(parse_err_full( - "Error opening file for redirection", - &path_tk.span - )); - }; - - let io_mode = IoMode::file(redir_bldr.tgt_fd.unwrap(), file); - let redir_bldr = redir_bldr.with_io_mode(io_mode); - let redir = redir_bldr.build(); - redirs.push(redir); - } - } + self.parse_redir(&mut redirs, &mut node_tks)?; self.assert_separator(&mut node_tks)?; @@ -1040,42 +1000,7 @@ impl ParseStream { } node_tks.push(self.next_tk().unwrap()); - while self.check_redir() { - let tk = self.next_tk().unwrap(); - node_tks.push(tk.clone()); - let redir_bldr = tk.span.as_str().parse::().unwrap(); - if redir_bldr.io_mode.is_none() { - let path_tk = self.next_tk(); - - if path_tk.clone().is_none_or(|tk| tk.class == TkRule::EOI) { - return Err( - ShErr::full( - ShErrKind::ParseErr, - "Expected a filename after this redirection", - tk.span.clone() - ) - ) - }; - - let path_tk = path_tk.unwrap(); - node_tks.push(path_tk.clone()); - let redir_class = redir_bldr.class.unwrap(); - let pathbuf = PathBuf::from(path_tk.span.as_str()); - - let Ok(file) = get_redir_file(redir_class, pathbuf) else { - self.panic_mode(&mut node_tks); - return Err(parse_err_full( - "Error opening file for redirection", - &path_tk.span - )); - }; - - let io_mode = IoMode::file(redir_bldr.tgt_fd.unwrap(), file); - let redir_bldr = redir_bldr.with_io_mode(io_mode); - let redir = redir_bldr.build(); - redirs.push(redir); - } - } + self.parse_redir(&mut redirs, &mut node_tks)?; let node = Node { class: NdRule::ForNode { vars, arr, body }, @@ -1256,15 +1181,7 @@ impl ParseStream { let redir_class = redir_bldr.class.unwrap(); let pathbuf = PathBuf::from(path_tk.span.as_str()); - let Ok(file) = get_redir_file(redir_class, pathbuf) else { - self.panic_mode(&mut node_tks); - return Err(parse_err_full( - "Error opening file for redirection", - &path_tk.span - )); - }; - - let io_mode = IoMode::file(redir_bldr.tgt_fd.unwrap(), file); + let io_mode = IoMode::file(redir_bldr.tgt_fd.unwrap(), pathbuf, redir_class); let redir_bldr = redir_bldr.with_io_mode(io_mode); let redir = redir_bldr.build(); redirs.push(redir); @@ -1421,7 +1338,7 @@ fn node_is_punctuated(tokens: &[Tk]) -> bool { }) } -fn get_redir_file(class: RedirType, path: PathBuf) -> ShResult { +pub fn get_redir_file(class: RedirType, path: PathBuf) -> ShResult { let result = match class { RedirType::Input => { OpenOptions::new() diff --git a/src/procio.rs b/src/procio.rs index ebb2fce..5a82edf 100644 --- a/src/procio.rs +++ b/src/procio.rs @@ -1,6 +1,6 @@ use std::{fmt::Debug, ops::{Deref, DerefMut}}; -use crate::{libsh::{error::{ShErr, ShErrKind, ShResult}, utils::RedirVecUtils}, parse::Redir, prelude::*}; +use crate::{libsh::{error::{ShErr, ShErrKind, ShResult}, utils::RedirVecUtils}, parse::{get_redir_file, Redir, RedirType}, prelude::*}; // Credit to fish-shell for many of the implementation ideas present in this module // https://fishshell.com/ @@ -8,7 +8,7 @@ use crate::{libsh::{error::{ShErr, ShErrKind, ShResult}, utils::RedirVecUtils}, #[derive(Clone,Debug)] pub enum IoMode { Fd { tgt_fd: RawFd, src_fd: Arc }, - File { tgt_fd: RawFd, file: Arc }, + File { tgt_fd: RawFd, path: PathBuf, mode: RedirType }, Pipe { tgt_fd: RawFd, pipe: Arc }, Buffer { buf: String, pipe: Arc } } @@ -18,9 +18,8 @@ impl IoMode { let src_fd = unsafe { OwnedFd::from_raw_fd(src_fd).into() }; Self::Fd { tgt_fd, src_fd } } - pub fn file(tgt_fd: RawFd, file: File) -> Self { - let file = file.into(); - Self::File { tgt_fd, file } + pub fn file(tgt_fd: RawFd, path: PathBuf, mode: RedirType) -> Self { + Self::File { tgt_fd, path, mode } } pub fn pipe(tgt_fd: RawFd, pipe: OwnedFd) -> Self { let pipe = pipe.into(); @@ -28,20 +27,27 @@ impl IoMode { } pub fn tgt_fd(&self) -> RawFd { match self { - IoMode::Fd { tgt_fd, src_fd: _ } | - IoMode::File { tgt_fd, file: _ } | - IoMode::Pipe { tgt_fd, pipe: _ } => *tgt_fd, + IoMode::Fd { tgt_fd, .. } | + IoMode::File { tgt_fd, .. } | + IoMode::Pipe { tgt_fd, .. } => *tgt_fd, _ => panic!() } } pub fn src_fd(&self) -> RawFd { match self { IoMode::Fd { tgt_fd: _, src_fd } => src_fd.as_raw_fd(), - IoMode::File { tgt_fd: _, file } => file.as_raw_fd(), + IoMode::File {..} => panic!("Attempted to obtain src_fd from file before opening"), IoMode::Pipe { tgt_fd: _, pipe } => pipe.as_raw_fd(), _ => panic!() } } + pub fn open_file(mut self) -> ShResult { + if let IoMode::File { tgt_fd, path, mode } = self { + let file = get_redir_file(mode, path)?; + self = IoMode::Fd { tgt_fd, src_fd: Arc::new(OwnedFd::from(file)) } + } + Ok(self) + } pub fn get_pipes() -> (Self,Self) { let (rpipe,wpipe) = pipe().unwrap(); ( @@ -149,6 +155,11 @@ impl<'e> IoFrame { self.save(); for redir in &mut self.redirs { let io_mode = &mut redir.io_mode; + flog!(DEBUG, io_mode); + if let IoMode::File {..} = io_mode { + *io_mode = io_mode.clone().open_file()?; + }; + flog!(DEBUG, io_mode); let tgt_fd = io_mode.tgt_fd(); let src_fd = io_mode.src_fd(); dup2(src_fd, tgt_fd)?; From b30de3232b75516d92ecf22fe94c20f2c826abd8 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Mon, 19 May 2025 16:08:21 -0400 Subject: [PATCH 07/19] Fully implemented vi-style editor commands --- src/libsh/error.rs | 2 + src/prompt/readline/keys.rs | 111 +++++++ src/prompt/readline/line.rs | 303 +++++++++++++++++++ src/prompt/readline/linecmd.rs | 364 +++++++++++++++++++++++ src/prompt/readline/mod.rs | 513 ++++++++++++++++----------------- src/prompt/readline/term.rs | 107 ++++--- 6 files changed, 1076 insertions(+), 324 deletions(-) create mode 100644 src/prompt/readline/keys.rs create mode 100644 src/prompt/readline/linecmd.rs diff --git a/src/libsh/error.rs b/src/libsh/error.rs index c0ec7f0..4d73854 100644 --- a/src/libsh/error.rs +++ b/src/libsh/error.rs @@ -325,6 +325,7 @@ pub enum ShErrKind { FuncReturn(i32), LoopContinue(i32), LoopBreak(i32), + ReadlineErr, Null } @@ -345,6 +346,7 @@ impl Display for ShErrKind { ShErrKind::FuncReturn(_) => "", ShErrKind::LoopContinue(_) => "", ShErrKind::LoopBreak(_) => "", + ShErrKind::ReadlineErr => "Line Read Error", ShErrKind::Null => "", }; write!(f,"{output}") diff --git a/src/prompt/readline/keys.rs b/src/prompt/readline/keys.rs new file mode 100644 index 0000000..eb9d60f --- /dev/null +++ b/src/prompt/readline/keys.rs @@ -0,0 +1,111 @@ +// Credit to Rustyline for the design ideas in this module +// https://github.com/kkawakam/rustyline +#[derive(Clone,Debug)] +pub struct KeyEvent(pub KeyCode, pub ModKeys); + +impl KeyEvent { + pub fn new(ch: char, mut mods: ModKeys) -> Self { + use {KeyCode as K, KeyEvent as E, ModKeys as M}; + + if !ch.is_control() { + if !mods.is_empty() { + mods.remove(M::SHIFT); // TODO Validate: no SHIFT even if + // `c` is uppercase + } + return E(K::Char(ch), mods); + } + match ch { + '\x00' => E(K::Char('@'), mods | M::CTRL), // '\0' + '\x01' => E(K::Char('A'), mods | M::CTRL), + '\x02' => E(K::Char('B'), mods | M::CTRL), + '\x03' => E(K::Char('C'), mods | M::CTRL), + '\x04' => E(K::Char('D'), mods | M::CTRL), + '\x05' => E(K::Char('E'), mods | M::CTRL), + '\x06' => E(K::Char('F'), mods | M::CTRL), + '\x07' => E(K::Char('G'), mods | M::CTRL), // '\a' + '\x08' => E(K::Backspace, mods), // '\b' + '\x09' => { + // '\t' + if mods.contains(M::SHIFT) { + mods.remove(M::SHIFT); + E(K::BackTab, mods) + } else { + E(K::Tab, mods) + } + } + '\x0a' => E(K::Char('J'), mods | M::CTRL), // '\n' (10) + '\x0b' => E(K::Char('K'), mods | M::CTRL), + '\x0c' => E(K::Char('L'), mods | M::CTRL), + '\x0d' => E(K::Enter, mods), // '\r' (13) + '\x0e' => E(K::Char('N'), mods | M::CTRL), + '\x0f' => E(K::Char('O'), mods | M::CTRL), + '\x10' => E(K::Char('P'), mods | M::CTRL), + '\x11' => E(K::Char('Q'), mods | M::CTRL), + '\x12' => E(K::Char('R'), mods | M::CTRL), + '\x13' => E(K::Char('S'), mods | M::CTRL), + '\x14' => E(K::Char('T'), mods | M::CTRL), + '\x15' => E(K::Char('U'), mods | M::CTRL), + '\x16' => E(K::Char('V'), mods | M::CTRL), + '\x17' => E(K::Char('W'), mods | M::CTRL), + '\x18' => E(K::Char('X'), mods | M::CTRL), + '\x19' => E(K::Char('Y'), mods | M::CTRL), + '\x1a' => E(K::Char('Z'), mods | M::CTRL), + '\x1b' => E(K::Esc, mods), // Ctrl-[, '\e' + '\x1c' => E(K::Char('\\'), mods | M::CTRL), + '\x1d' => E(K::Char(']'), mods | M::CTRL), + '\x1e' => E(K::Char('^'), mods | M::CTRL), + '\x1f' => E(K::Char('_'), mods | M::CTRL), + '\x7f' => E(K::Backspace, mods), // Rubout, Ctrl-? + '\u{9b}' => E(K::Esc, mods | M::SHIFT), + _ => E(K::Null, mods), + } + } +} + +#[derive(Clone,Debug)] +pub enum KeyCode { + UnknownEscSeq, + Backspace, + BackTab, + BracketedPasteStart, + BracketedPasteEnd, + Char(char), + Delete, + Down, + End, + Enter, + Esc, + F(u8), + Home, + Insert, + Left, + Null, + PageDown, + PageUp, + Right, + Tab, + Up, +} + +bitflags::bitflags! { + #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] + pub struct ModKeys: u8 { + /// Control modifier + const CTRL = 1<<3; + /// Escape or Alt modifier + const ALT = 1<<2; + /// Shift modifier + const SHIFT = 1<<1; + + /// No modifier + const NONE = 0; + /// Ctrl + Shift + const CTRL_SHIFT = Self::CTRL.bits() | Self::SHIFT.bits(); + /// Alt + Shift + const ALT_SHIFT = Self::ALT.bits() | Self::SHIFT.bits(); + /// Ctrl + Alt + const CTRL_ALT = Self::CTRL.bits() | Self::ALT.bits(); + /// Ctrl + Alt + Shift + const CTRL_ALT_SHIFT = Self::CTRL.bits() | Self::ALT.bits() | Self::SHIFT.bits(); + } +} diff --git a/src/prompt/readline/line.rs b/src/prompt/readline/line.rs index f2c78de..2f9c7e6 100644 --- a/src/prompt/readline/line.rs +++ b/src/prompt/readline/line.rs @@ -1,3 +1,9 @@ +use std::ops::Range; + +use crate::{libsh::error::ShResult, prompt::readline::linecmd::Anchor}; + +use super::linecmd::{At, CharSearch, MoveCmd, Movement, Verb, VerbCmd, Word}; + #[derive(Default,Debug)] pub struct LineBuf { @@ -9,6 +15,10 @@ impl LineBuf { pub fn new() -> Self { Self::default() } + pub fn with_initial(mut self, init: S) -> Self { + self.buffer = init.to_string().chars().collect(); + self + } pub fn count_lines(&self) -> usize { self.buffer.iter().filter(|&&c| c == '\n').count() } @@ -19,6 +29,27 @@ impl LineBuf { self.buffer.clear(); self.cursor = 0; } + pub fn backspace(&mut self) { + if self.cursor() == 0 { + return + } + self.delete_pos(self.cursor() - 1); + } + pub fn delete(&mut self) { + if self.cursor() >= self.buffer.len() { + return + } + self.delete_pos(self.cursor()); + } + pub fn delete_pos(&mut self, pos: usize) { + self.buffer.remove(pos); + if pos < self.cursor() { + self.cursor = self.cursor.saturating_sub(1) + } + if self.cursor() >= self.buffer.len() { + self.cursor = self.buffer.len().saturating_sub(1) + } + } pub fn insert_at_cursor(&mut self, ch: char) { self.buffer.insert(self.cursor, ch); self.move_cursor_right(); @@ -74,8 +105,280 @@ impl LineBuf { self.buffer.drain(start..end); self.cursor = start; } + pub fn len(&self) -> usize { + self.buffer.len() + } + pub fn is_empty(&self) -> bool { + self.buffer.is_empty() + } + pub fn cursor_char(&self) -> char { + self.buffer[self.cursor] + } + fn backward_until bool>(&self, mut start: usize, cond: F) -> usize { + while start > 0 && !cond(start) { + start -= 1; + } + start + } + fn forward_until bool>(&self, mut start: usize, cond: F) -> usize { + while start < self.len() && !cond(start) { + start += 1; + } + start + } + pub fn calc_range(&self, movement: &Movement) -> Range { + let mut start = self.cursor(); + let mut end = self.cursor(); + + match movement { + Movement::WholeLine => { + start = self.backward_until(start, |pos| self.buffer[pos] == '\n'); + if self.buffer.get(start) == Some(&'\n') { + start += 1; // Exclude the previous newline + } + end = self.forward_until(end, |pos| self.buffer[pos] == '\n'); + } + Movement::BeginningOfLine => { + start = self.backward_until(start, |pos| self.buffer[pos] == '\n'); + } + Movement::BeginningOfFirstWord => { + let start_of_line = self.backward_until(start, |pos| self.buffer[pos] == '\n'); + start = self.forward_until(start_of_line, |pos| !self.buffer[pos].is_whitespace()); + } + Movement::EndOfLine => { + end = self.forward_until(end, |pos| self.buffer[pos] == '\n'); + } + Movement::BackwardWord(word) => { + let cur_char = self.cursor_char(); + match word { + Word::Big => { + if cur_char.is_whitespace() { + start = self.backward_until(start, |pos| !self.buffer[pos].is_whitespace()) + } + start = self.backward_until(start, |pos| self.buffer[pos].is_whitespace()); + start += 1; + } + Word::Normal => { + if cur_char.is_alphanumeric() || cur_char == '_' { + start = self.backward_until(start, |pos| !(self.buffer[pos].is_alphanumeric() || self.buffer[pos] == '_')); + start += 1; + } else { + start = self.backward_until(start, |pos| (self.buffer[pos].is_alphanumeric() || self.buffer[pos] == '_')); + start += 1; + } + } + } + } + Movement::ForwardWord(at, word) => { + let cur_char = self.cursor_char(); + let is_ws = |pos: usize| self.buffer[pos].is_whitespace(); + let not_ws = |pos: usize| !self.buffer[pos].is_whitespace(); + + match word { + Word::Big => { + if cur_char.is_whitespace() { + end = self.forward_until(end, not_ws); + } else { + end = self.forward_until(end, is_ws); + end = self.forward_until(end, not_ws); + } + + match at { + At::Start => {/* Done */} + At::AfterEnd => { + end = self.forward_until(end, is_ws); + } + At::BeforeEnd => { + end = self.forward_until(end, is_ws); + end = end.saturating_sub(1); + } + } + } + Word::Normal => { + let ch_class = CharClass::from(self.buffer[end]); + if cur_char.is_whitespace() { + end = self.forward_until(end, not_ws); + } else { + end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])) + } + + match at { + At::Start => {/* Done */ } + At::AfterEnd => { + end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])); + } + At::BeforeEnd => { + end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])); + end = end.saturating_sub(1); + } + } + } + } + } + Movement::BackwardChar => { + start = start.saturating_sub(1); + } + Movement::ForwardChar => { + end = end.saturating_add(1); + } + Movement::TextObj(text_obj, bound) => todo!(), + Movement::CharSearch(char_search) => { + match char_search { + CharSearch::FindFwd(ch) => { + let search = self.forward_until(end, |pos| self.buffer[pos] == *ch); + + // we check anyway because it may have reached the end without finding anything + if self.buffer[search] == *ch { + end = search; + } + } + CharSearch::FwdTo(ch) => { + let search = self.forward_until(end, |pos| self.buffer[pos] == *ch); + + // we check anyway because it may have reached the end without finding anything + if self.buffer[search] == *ch { + end = search.saturating_sub(1); + } + } + CharSearch::FindBkwd(ch) => { + let search = self.forward_until(start, |pos| self.buffer[pos] == *ch); + + // we check anyway because it may have reached the end without finding anything + if self.buffer[search] == *ch { + start = search; + } + } + CharSearch::BkwdTo(ch) => { + let search = self.forward_until(start, |pos| self.buffer[pos] == *ch); + + // we check anyway because it may have reached the end without finding anything + if self.buffer[search] == *ch { + start = search.saturating_add(1); + } + } + } + } + Movement::ViFirstPrint => todo!(), + Movement::LineUp => todo!(), + Movement::LineDown => todo!(), + Movement::WholeBuffer => { + start = 0; + end = self.len().saturating_sub(1); + } + Movement::BeginningOfBuffer => { + start = 0; + } + Movement::EndOfBuffer => { + end = self.len().saturating_sub(1); + } + Movement::Null => {/* nothing */} + } + + end = end.min(self.len()); + + start..end + } + pub fn exec_vi_cmd(&mut self, verb: Option, move_cmd: Option) -> ShResult<()> { + match (verb, move_cmd) { + (Some(v), None) => self.exec_vi_verb(v), + (None, Some(m)) => self.exec_vi_movement(m), + (Some(v), Some(m)) => self.exec_vi_moveverb(v,m), + (None, None) => unreachable!() + } + } + pub fn exec_vi_verb(&mut self, verb: Verb) -> ShResult<()> { + assert!(!verb.needs_movement()); + match verb { + Verb::DeleteOne(anchor) => { + match anchor { + Anchor::After => { + self.delete(); + } + Anchor::Before => { + self.backspace(); + } + } + } + Verb::InsertChar(ch) => self.insert_at_cursor(ch), + Verb::InsertMode => todo!(), + Verb::JoinLines => todo!(), + Verb::ToggleCase => todo!(), + Verb::OverwriteMode => todo!(), + Verb::Substitute => todo!(), + Verb::Put(_) => todo!(), + Verb::Undo => todo!(), + Verb::RepeatLast => todo!(), + Verb::Dedent => todo!(), + Verb::Indent => todo!(), + Verb::ReplaceChar(_) => todo!(), + _ => unreachable!() + } + Ok(()) + } + pub fn exec_vi_movement(&mut self, move_cmd: MoveCmd) -> ShResult<()> { + let MoveCmd { move_count, movement } = move_cmd; + for _ in 0..move_count { + let range = self.calc_range(&movement); + if range.start != self.cursor() { + self.cursor = range.start.max(0); + } else { + self.cursor = range.end.min(self.len()); + } + } + Ok(()) + } + pub fn exec_vi_moveverb(&mut self, verb: Verb, move_cmd: MoveCmd) -> ShResult<()> { + let MoveCmd { move_count, movement } = move_cmd; + match verb { + Verb::Delete => { + (0..move_count).for_each(|_| { + let range = self.calc_range(&movement); + }); + } + Verb::DeleteOne(anchor) => todo!(), + Verb::Change => todo!(), + Verb::Yank => todo!(), + Verb::ReplaceChar(_) => todo!(), + Verb::Substitute => todo!(), + Verb::ToggleCase => todo!(), + Verb::Undo => todo!(), + Verb::RepeatLast => todo!(), + Verb::Put(anchor) => todo!(), + Verb::OverwriteMode => todo!(), + Verb::InsertMode => todo!(), + Verb::JoinLines => todo!(), + Verb::InsertChar(_) => todo!(), + Verb::Indent => todo!(), + Verb::Dedent => todo!(), + } + Ok(()) + } } +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum CharClass { + AlphaNum, + Symbol +} + +impl CharClass { + pub fn is_opposite(&self, ch: char) -> bool { + let opp_class = CharClass::from(ch); + opp_class != *self + } +} + +impl From for CharClass { + fn from(value: char) -> Self { + if value.is_alphanumeric() || value == '_' { + CharClass::AlphaNum + } else { + CharClass::Symbol + } + } +} + + pub fn strip_ansi_codes(s: &str) -> String { let mut out = String::with_capacity(s.len()); let mut chars = s.chars().peekable(); diff --git a/src/prompt/readline/linecmd.rs b/src/prompt/readline/linecmd.rs new file mode 100644 index 0000000..c8ed00d --- /dev/null +++ b/src/prompt/readline/linecmd.rs @@ -0,0 +1,364 @@ +// Credit to Rustyline for enumerating these editor commands +// https://github.com/kkawakam/rustyline + +use crate::libsh::error::{ShErr, ShErrKind, ShResult}; +use crate::prelude::*; + +pub type RepeatCount = u16; + +#[derive(Default, Debug, Clone, Eq, PartialEq)] +pub struct ViCmdBuilder { + verb_count: Option, + verb: Option, + move_count: Option, + movement: Option, +} + +impl ViCmdBuilder { + pub fn new() -> Self { + Self::default() + } + pub fn with_verb_count(self, verb_count: u16) -> Self { + let Self { verb_count: _, verb, move_count, movement } = self; + Self { verb_count: Some(verb_count), verb, move_count, movement } + } + pub fn with_verb(self, verb: Verb) -> Self { + let Self { verb_count, verb: _, move_count, movement } = self; + Self { verb_count, verb: Some(verb), move_count, movement } + } + pub fn with_move_count(self, move_count: u16) -> Self { + let Self { verb_count, verb, move_count: _, movement } = self; + Self { verb_count, verb, move_count: Some(move_count), movement } + } + pub fn with_movement(self, movement: Movement) -> Self { + let Self { verb_count, verb, move_count, movement: _ } = self; + Self { verb_count, verb, move_count, movement: Some(movement) } + } + pub fn append_digit(&mut self, digit: char) { + // Convert char digit to a number (assuming ASCII '0'..'9') + let digit_val = digit.to_digit(10).expect("digit must be 0-9") as u16; + + if self.verb.is_none() { + // Append to verb_count + self.verb_count = Some(match self.verb_count { + Some(count) => count * 10 + digit_val, + None => digit_val, + }); + } else { + // Append to move_count + self.move_count = Some(match self.move_count { + Some(count) => count * 10 + digit_val, + None => digit_val, + }); + } + } + pub fn is_unfinished(&self) -> bool { + (self.verb.is_none() && self.movement.is_none()) || + (self.verb.is_none() && self.movement.as_ref().is_some_and(|m| m.needs_verb())) || + (self.movement.is_none() && self.verb.as_ref().is_some_and(|v| v.needs_movement())) + } + pub fn build(self) -> ShResult { + if self.is_unfinished() { + flog!(ERROR, "Unfinished Builder: {:?}", self); + return Err( + ShErr::simple(ShErrKind::ReadlineErr, "called ViCmdBuilder::build() with an unfinished builder") + ) + } + let Self { verb_count, verb, move_count, movement } = self; + let verb_count = verb_count.unwrap_or(1); + let move_count = move_count.unwrap_or(if verb.is_none() { verb_count } else { 1 }); + let verb = verb.map(|v| VerbCmd { verb_count, verb: v }); + let movement = movement.map(|m| MoveCmd { move_count, movement: m }); + Ok(match (verb, movement) { + (Some(v), Some(m)) => ViCmd::MoveVerb(v, m), + (Some(v), None) => ViCmd::Verb(v), + (None, Some(m)) => ViCmd::Move(m), + (None, None) => unreachable!(), + }) + } +} + + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum ViCmd { + MoveVerb(VerbCmd, MoveCmd), + Verb(VerbCmd), + Move(MoveCmd) +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct VerbCmd { + pub verb_count: u16, + pub verb: Verb +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub struct MoveCmd { + pub move_count: u16, + pub movement: Movement +} + +#[derive(Debug, Clone, Eq, PartialEq)] +#[non_exhaustive] +pub enum Verb { + /// `d`, `D` — delete motion or line + Delete, + /// `x`, `X` — delete one char, forward or back + DeleteOne(Anchor), + /// `c`, `C` — change (delete + insert) + Change, + /// `y`, `Y` — yank (copy) + Yank, + /// `r` — replace a single character + ReplaceChar(char), + /// `s` or `S` — substitute (change + single char or line) + Substitute, + /// `~` — swap case + ToggleCase, + /// `u` — undo + Undo, + /// `.` — repeat last edit + RepeatLast, + /// `p`, `P` — paste + Put(Anchor), + /// `R` — overwrite characters + OverwriteMode, + /// `i`, `a`, `I`, `A`, `o`, `O` — insert/append text + InsertMode, + /// `J` — join lines + JoinLines, + InsertChar(char), + Indent, + Dedent +} + +impl Verb { + pub fn needs_movement(&self) -> bool { + match self { + Verb::DeleteOne(_) | + Verb::InsertMode | + Verb::JoinLines | + Verb::ToggleCase | + Verb::OverwriteMode | + Verb::Substitute | + Verb::Put(_) | + Verb::Undo | + Verb::RepeatLast | + Verb::Dedent | + Verb::Indent | + Verb::InsertChar(_) | + Verb::ReplaceChar(_) => false, + Verb::Delete | + Verb::Change | + Verb::Yank => true + } + } +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum Movement { + /// Whole current line (not really a movement but a range) + WholeLine, + TextObj(TextObj, Bound), + BeginningOfFirstWord, + /// beginning-of-line + BeginningOfLine, + /// end-of-line + EndOfLine, + /// backward-word, vi-prev-word + BackwardWord(Word), // Backward until start of word + /// forward-word, vi-end-word, vi-next-word + ForwardWord(At, Word), // Forward until start/end of word + /// character-search, character-search-backward, vi-char-search + CharSearch(CharSearch), + /// vi-first-print + ViFirstPrint, + /// backward-char + BackwardChar, + /// forward-char + ForwardChar, + /// move to the same column on the previous line + LineUp, + /// move to the same column on the next line + LineDown, + /// Whole user input (not really a movement but a range) + WholeBuffer, + /// beginning-of-buffer + BeginningOfBuffer, + /// end-of-buffer + EndOfBuffer, + Null +} + +impl Movement { + pub fn needs_verb(&self) -> bool { + match self { + Self::WholeLine | + Self::BeginningOfLine | + Self::BeginningOfFirstWord | + Self::EndOfLine | + Self::BackwardWord(_) | + Self::ForwardWord(_, _) | + Self::CharSearch(_) | + Self::ViFirstPrint | + Self::BackwardChar | + Self::ForwardChar | + Self::LineUp | + Self::LineDown | + Self::WholeBuffer | + Self::BeginningOfBuffer | + Self::EndOfBuffer => false, + Self::Null | + Self::TextObj(_, _) => true + } + } +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum TextObj { + /// `iw`, `aw` — inner word, around word + Word, + + /// `is`, `as` — inner sentence, around sentence + Sentence, + + /// `ip`, `ap` — inner paragraph, around paragraph + Paragraph, + + /// `i"`, `a"` — inner/around double quotes + DoubleQuote, + /// `i'`, `a'` + SingleQuote, + /// `i\``, `a\`` + BacktickQuote, + + /// `i)`, `a)` — round parens + Paren, + /// `i]`, `a]` + Bracket, + /// `i}`, `a}` + Brace, + /// `i<`, `a<` + Angle, + + /// `it`, `at` — HTML/XML tags (if you support it) + Tag, + + /// Custom user-defined objects maybe? + Custom(char), +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum Bound { + Inside, + Around +} + +#[derive(Debug, Clone, Eq, PartialEq)] +#[non_exhaustive] +pub enum LineCmd { + Abort, + AcceptLine, + BeginningOfHistory, + CapitalizeWord, + ClearScreen, + Complete, + CompleteBackward, + CompleteHint, + DowncaseWord, + EndOfFile, + EndOfHistory, + ForwardSearchHistory, + HistorySearchBackward, + HistorySearchForward, + Insert(String), + Interrupt, + Move(Movement), + NextHistory, + Noop, + Overwrite(char), + PreviousHistory, + QuotedInsert, + Repaint, + ReverseSearchHistory, + Suspend, + TransposeChars, + TransposeWords, + YankPop, + LineUpOrPreviousHistory, + LineDownOrNextHistory, + Newline, + AcceptOrInsertLine { accept_in_the_middle: bool }, + /// 🧵 New: vi-style editing command + ViCmd(ViCmd), + /// unknown/unmapped key + Unknown, + Null, +} +impl LineCmd { + pub fn backspace() -> Self { + let cmd = ViCmdBuilder::new() + .with_verb(Verb::DeleteOne(Anchor::Before)) + .build() + .unwrap(); + Self::ViCmd(cmd) + } + const fn is_repeatable_change(&self) -> bool { + matches!( + *self, + Self::Insert(..) + | Self::ViCmd(..) + ) + } + + const fn is_repeatable(&self) -> bool { + match *self { + Self::Move(_) => true, + _ => self.is_repeatable_change(), + } + } +} + +#[derive(Debug, Clone, Eq, PartialEq, Copy)] +pub enum At { + Start, + BeforeEnd, + AfterEnd +} + +#[derive(Debug, Clone, Eq, PartialEq, Copy)] +pub enum Anchor { + After, + Before +} + +#[derive(Debug, Clone, Eq, PartialEq, Copy)] +pub enum CharSearch { + FindFwd(char), + FwdTo(char), + FindBkwd(char), + BkwdTo(char) +} + +#[derive(Debug, Clone, Eq, PartialEq, Copy)] +pub enum Word { + Big, + Normal +} + + +const fn repeat_count(previous: RepeatCount, new: Option) -> RepeatCount { + match new { + Some(n) => n, + None => previous, + } +} + +#[derive(Default,Debug,Clone,Copy,PartialEq,Eq,PartialOrd,Ord)] +pub enum InputMode { + Normal, + #[default] + Insert, + Visual, + Replace +} diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 8fe7c44..f0dd33d 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -1,94 +1,40 @@ use std::{arch::asm, os::fd::BorrowedFd}; +use keys::KeyEvent; use line::{strip_ansi_codes, LineBuf}; +use linecmd::{Anchor, At, InputMode, LineCmd, MoveCmd, Movement, Verb, VerbCmd, ViCmd, ViCmdBuilder, Word}; use nix::{libc::STDIN_FILENO, sys::termios::{self, Termios}, unistd::read}; use term::Terminal; use unicode_width::UnicodeWidthStr; -use crate::{libsh::{error::ShResult, sys::sh_quit}, prelude::*}; +use crate::{libsh::{error::{ShErr, ShErrKind, ShResult}, sys::sh_quit}, prelude::*}; pub mod term; pub mod line; - -#[derive(Clone,Copy,Debug)] -pub enum Key { - Char(char), - Enter, - Backspace, - Delete, - Esc, - Up, - Down, - Left, - Right, - Ctrl(char), - Unknown, -} - -#[derive(Clone,Debug)] -pub enum EditAction { - Return, - Exit(i32), - ClearTerm, - ClearLine, - Signal(i32), - MoveCursorStart, - MoveCursorEnd, - MoveCursorLeft, // Ctrl + B - MoveCursorRight, // Ctrl + F - DelWordBack, - DelFromCursor, - Backspace, // The Ctrl+H version - RedrawScreen, - HistNext, - HistPrev, - InsMode(InsAction), - NormMode(NormAction), -} - -#[derive(Clone,Debug)] -pub enum InsAction { - InsChar(char), - Backspace, // The backspace version - Delete, - Esc, - MoveLeft, // Left Arrow - MoveRight, // Right Arrow - MoveUp, - MoveDown -} - -#[derive(Clone,Debug)] -pub enum NormAction { - Count(usize), - Motion(Motion), -} - -#[derive(Clone,Debug)] -pub enum Motion { -} - -impl EditAction { - pub fn is_return(&self) -> bool { - matches!(self, Self::Return) - } -} - +pub mod keys; +pub mod linecmd; #[derive(Default,Debug)] pub struct FernReader { pub term: Terminal, pub prompt: String, pub line: LineBuf, - pub edit_mode: EditMode + pub edit_mode: InputMode, + pub count_arg: u16, + pub last_effect: Option, + pub last_movement: Option } impl FernReader { pub fn new(prompt: String) -> Self { + let line = LineBuf::new().with_initial("The quick brown fox jumped over the lazy dog."); Self { term: Terminal::new(), prompt, - line: Default::default(), - edit_mode: Default::default() + line, + edit_mode: Default::default(), + count_arg: Default::default(), + last_effect: Default::default(), + last_movement: Default::default(), } } fn pack_line(&mut self) -> String { @@ -100,167 +46,14 @@ impl FernReader { pub fn readline(&mut self) -> ShResult { self.display_line(/*refresh: */ false); loop { - let cmds = self.get_cmds(); - for cmd in &cmds { - if cmd.is_return() { - self.term.write_bytes(b"\r\n"); - return Ok(self.pack_line()) - } + let cmd = self.next_cmd()?; + if cmd == LineCmd::AcceptLine { + return Ok(self.pack_line()) } - self.process_cmds(cmds)?; + self.execute_cmd(cmd)?; self.display_line(/* refresh: */ true); } } - pub fn process_cmds(&mut self, cmds: Vec) -> ShResult<()> { - for cmd in cmds { - match cmd { - EditAction::Exit(code) => { - self.term.write_bytes(b"\r\n"); - sh_quit(code) - } - EditAction::ClearTerm => self.term.clear(), - EditAction::ClearLine => self.line.clear(), - EditAction::Signal(sig) => todo!(), - EditAction::MoveCursorStart => self.line.move_cursor_start(), - EditAction::MoveCursorEnd => self.line.move_cursor_end(), - EditAction::MoveCursorLeft => self.line.move_cursor_left(), - EditAction::MoveCursorRight => self.line.move_cursor_right(), - EditAction::DelWordBack => self.line.del_word_back(), - EditAction::DelFromCursor => self.line.del_from_cursor(), - EditAction::Backspace => self.line.backspace_at_cursor(), - EditAction::RedrawScreen => self.term.clear(), - EditAction::HistNext => todo!(), - EditAction::HistPrev => todo!(), - EditAction::InsMode(ins_action) => self.process_ins_cmd(ins_action)?, - EditAction::NormMode(norm_action) => self.process_norm_cmd(norm_action)?, - EditAction::Return => unreachable!(), // handled earlier - } - } - - Ok(()) - } - pub fn process_ins_cmd(&mut self, cmd: InsAction) -> ShResult<()> { - match cmd { - InsAction::InsChar(ch) => self.line.insert_at_cursor(ch), - InsAction::Backspace => self.line.backspace_at_cursor(), - InsAction::Delete => self.line.del_at_cursor(), - InsAction::Esc => todo!(), - InsAction::MoveLeft => self.line.move_cursor_left(), - InsAction::MoveRight => self.line.move_cursor_right(), - InsAction::MoveUp => todo!(), - InsAction::MoveDown => todo!(), - } - Ok(()) - } - pub fn process_norm_cmd(&mut self, cmd: NormAction) -> ShResult<()> { - match cmd { - NormAction::Count(num) => todo!(), - NormAction::Motion(motion) => todo!(), - } - Ok(()) - } - pub fn get_cmds(&mut self) -> Vec { - match self.edit_mode { - EditMode::Normal => { - let keys = self.read_keys_normal_mode(); - self.process_keys_normal_mode(keys) - } - EditMode::Insert => { - let key = self.read_key().unwrap(); - self.process_key_insert_mode(key) - } - } - } - pub fn read_keys_normal_mode(&mut self) -> Vec { - todo!() - } - pub fn process_keys_normal_mode(&mut self, keys: Vec) -> Vec { - todo!() - } - pub fn process_key_insert_mode(&mut self, key: Key) -> Vec { - match key { - Key::Char(ch) => { - vec![EditAction::InsMode(InsAction::InsChar(ch))] - } - Key::Enter => { - vec![EditAction::Return] - } - Key::Backspace => { - vec![EditAction::InsMode(InsAction::Backspace)] - } - Key::Delete => { - vec![EditAction::InsMode(InsAction::Delete)] - } - Key::Esc => { - vec![EditAction::InsMode(InsAction::Esc)] - } - Key::Up => { - vec![EditAction::InsMode(InsAction::MoveUp)] - } - Key::Down => { - vec![EditAction::InsMode(InsAction::MoveDown)] - } - Key::Left => { - vec![EditAction::InsMode(InsAction::MoveLeft)] - } - Key::Right => { - vec![EditAction::InsMode(InsAction::MoveRight)] - } - Key::Ctrl(ctrl) => self.process_ctrl(ctrl), - Key::Unknown => unimplemented!("Unknown key received: {key:?}") - } - } - pub fn process_ctrl(&mut self, ctrl: char) -> Vec { - match ctrl { - 'D' => { - if self.line.buffer.is_empty() { - vec![EditAction::Exit(0)] - } else { - vec![EditAction::Return] - } - } - 'C' => { - vec![EditAction::ClearLine] - } - 'Z' => { - vec![EditAction::Signal(20)] // SIGTSTP - } - 'A' => { - vec![EditAction::MoveCursorStart] - } - 'E' => { - vec![EditAction::MoveCursorEnd] - } - 'B' => { - vec![EditAction::MoveCursorLeft] - } - 'F' => { - vec![EditAction::MoveCursorRight] - } - 'U' => { - vec![EditAction::ClearLine] - } - 'W' => { - vec![EditAction::DelWordBack] - } - 'K' => { - vec![EditAction::DelFromCursor] - } - 'H' => { - vec![EditAction::Backspace] - } - 'L' => { - vec![EditAction::RedrawScreen] - } - 'N' => { - vec![EditAction::HistNext] - } - 'P' => { - vec![EditAction::HistPrev] - } - _ => unimplemented!("Unhandled control character: {ctrl}") - } - } fn clear_line(&self) { let prompt_lines = self.prompt.lines().count(); let buf_lines = self.line.count_lines().saturating_sub(1); // One of the buffer's lines will overlap with the prompt. probably. @@ -291,53 +84,237 @@ impl FernReader { let cursor_offset = self.line.cursor() + last_line_len; self.term.write(&format!("\r\x1b[{}C", cursor_offset)); } - fn read_key(&mut self) -> Option { - let mut buf = [0; 4]; - - let n = self.term.read_byte(&mut buf); - if n == 0 { - return None; + pub fn next_cmd(&mut self) -> ShResult { + let vi_cmd = ViCmdBuilder::new(); + match self.edit_mode { + InputMode::Normal => self.get_normal_cmd(vi_cmd), + InputMode::Insert => self.get_insert_cmd(vi_cmd), + InputMode::Visual => todo!(), + InputMode::Replace => todo!(), } - match buf[0] { - b'\x1b' => { - if n == 3 { - match (buf[1], buf[2]) { - (b'[', b'A') => Some(Key::Up), - (b'[', b'B') => Some(Key::Down), - (b'[', b'C') => Some(Key::Right), - (b'[', b'D') => Some(Key::Left), - _ => { - flog!(WARN, "unhandled control seq: {},{}", buf[1] as char, buf[2] as char); - Some(Key::Esc) - } - } - } else if n == 4 { - match (buf[1], buf[2], buf[3]) { - (b'[', b'3', b'~') => Some(Key::Delete), - _ => { - flog!(WARN, "unhandled control seq: {},{},{}", buf[1] as char, buf[2] as char, buf[3] as char); - Some(Key::Esc) - } - } - } else { - Some(Key::Esc) + } + pub fn get_insert_cmd(&mut self, pending_cmd: ViCmdBuilder) -> ShResult { + use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; + let key = self.term.read_key(); + let cmd = match key { + E(K::Char(ch), M::NONE) => { + let cmd = pending_cmd + .with_verb(Verb::InsertChar(ch)) + .build()?; + LineCmd::ViCmd(cmd) + } + + E(K::Char('H'), M::CTRL) | + E(K::Backspace, M::NONE) => LineCmd::backspace(), + + E(K::BackTab, M::NONE) => LineCmd::CompleteBackward, + + E(K::Char('I'), M::CTRL) | + E(K::Tab, M::NONE) => LineCmd::Complete, + + E(K::Esc, M::NONE) => { + self.edit_mode = InputMode::Normal; + let cmd = pending_cmd + .with_movement(Movement::BackwardChar) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('D'), M::CTRL) => LineCmd::EndOfFile, + _ => { + flog!(INFO, "unhandled key in get_insert_cmd, trying common_cmd..."); + return self.common_cmd(key, pending_cmd) + } + }; + Ok(cmd) + } + + pub fn get_normal_cmd(&mut self, mut pending_cmd: ViCmdBuilder) -> ShResult { + use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; + let key = self.term.read_key(); + if let E(K::Char(digit @ '0'..='9'), M::NONE) = key { + pending_cmd.append_digit(digit); + return self.get_normal_cmd(pending_cmd); + } + let cmd = match key { + E(K::Char('h'), M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::BackwardChar) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('j'), M::NONE) => LineCmd::LineDownOrNextHistory, + E(K::Char('k'), M::NONE) => LineCmd::LineUpOrPreviousHistory, + E(K::Char('l'), M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::ForwardChar) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('w'), M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::ForwardWord(At::Start, Word::Normal)) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('W'), M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::ForwardWord(At::Start, Word::Big)) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('b'), M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::BackwardWord(Word::Normal)) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('B'), M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::BackwardWord(Word::Big)) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('x'), M::NONE) => { + let cmd = pending_cmd + .with_verb(Verb::DeleteOne(Anchor::After)) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('i'), M::NONE) => { + self.edit_mode = InputMode::Insert; + let cmd = pending_cmd + .with_movement(Movement::BackwardChar) + .build()?; + LineCmd::ViCmd(cmd) + } + E(K::Char('I'), M::NONE) => { + self.edit_mode = InputMode::Insert; + let cmd = pending_cmd + .with_movement(Movement::BeginningOfFirstWord) + .build()?; + LineCmd::ViCmd(cmd) + } + _ => { + flog!(INFO, "unhandled key in get_normal_cmd, trying common_cmd..."); + return self.common_cmd(key, pending_cmd) + } + }; + Ok(cmd) + } + + pub fn common_cmd(&mut self, key: KeyEvent, pending_cmd: ViCmdBuilder) -> ShResult { + use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; + match key { + E(K::Home, M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::BeginningOfLine) + .build()?; + Ok(LineCmd::ViCmd(cmd)) + } + E(K::End, M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::EndOfLine) + .build()?; + Ok(LineCmd::ViCmd(cmd)) + } + E(K::Left, M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::BackwardChar) + .build()?; + Ok(LineCmd::ViCmd(cmd)) + } + E(K::Right, M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::ForwardChar) + .build()?; + Ok(LineCmd::ViCmd(cmd)) + } + E(K::Delete, M::NONE) => { + let cmd = pending_cmd + .with_movement(Movement::ForwardChar) + .with_verb(Verb::Delete) + .build()?; + Ok(LineCmd::ViCmd(cmd)) + } + E(K::Backspace, M::NONE) | + E(K::Char('h'), M::CTRL) => { + Ok(LineCmd::backspace()) + } + E(K::Up, M::NONE) => Ok(LineCmd::LineUpOrPreviousHistory), + E(K::Down, M::NONE) => Ok(LineCmd::LineDownOrNextHistory), + E(K::Enter, M::NONE) => Ok(LineCmd::AcceptLine), + _ => Err(ShErr::simple(ShErrKind::ReadlineErr,format!("Unhandled common key event: {key:?}"))) + } + } + pub fn exec_vi_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { + match cmd { + ViCmd::MoveVerb(verb_cmd, move_cmd) => { + self.last_effect = Some(verb_cmd.clone()); + self.last_movement = Some(move_cmd.clone()); + let VerbCmd { verb_count, verb } = verb_cmd; + for _ in 0..verb_count { + self.line.exec_vi_cmd(Some(verb.clone()), Some(move_cmd.clone()))?; } } - b'\r' | b'\n' => Some(Key::Enter), - 0x7f => Some(Key::Backspace), - c if (c as char).is_ascii_control() => { - let ctrl = (c ^ 0x40) as char; - Some(Key::Ctrl(ctrl)) + ViCmd::Verb(verb_cmd) => { + self.last_effect = Some(verb_cmd.clone()); + let VerbCmd { verb_count, verb } = verb_cmd; + for _ in 0..verb_count { + self.line.exec_vi_cmd(Some(verb.clone()), None)?; + } + } + ViCmd::Move(move_cmd) => { + self.last_movement = Some(move_cmd.clone()); + self.line.exec_vi_cmd(None, Some(move_cmd))?; } - c => Some(Key::Char(c as char)) } + Ok(()) + } + pub fn execute_cmd(&mut self, cmd: LineCmd) -> ShResult<()> { + match cmd { + LineCmd::ViCmd(cmd) => self.exec_vi_cmd(cmd)?, + LineCmd::Abort => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::BeginningOfHistory => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::CapitalizeWord => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::ClearScreen => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Complete => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::CompleteBackward => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::CompleteHint => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::DowncaseWord => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::EndOfFile => { + if self.line.buffer.is_empty() { + sh_quit(0); + } else { + self.line.clear(); + } + } + LineCmd::EndOfHistory => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::ForwardSearchHistory => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::HistorySearchBackward => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::HistorySearchForward => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Insert(_) => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Interrupt => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Move(_) => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::NextHistory => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Noop => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Repaint => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Overwrite(ch) => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::PreviousHistory => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::QuotedInsert => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::ReverseSearchHistory => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Suspend => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::TransposeChars => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::TransposeWords => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Unknown => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::YankPop => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::LineUpOrPreviousHistory => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::LineDownOrNextHistory => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Newline => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::AcceptOrInsertLine { .. } => todo!("Unhandled cmd: {cmd:?}"), + LineCmd::Null => { /* Pass */ } + _ => todo!("Unhandled cmd: {cmd:?}"), + } + Ok(()) } } -#[derive(Default,Debug)] -pub enum EditMode { - Normal, - #[default] - Insert, -} - diff --git a/src/prompt/readline/term.rs b/src/prompt/readline/term.rs index 7398038..2dfe977 100644 --- a/src/prompt/readline/term.rs +++ b/src/prompt/readline/term.rs @@ -1,7 +1,7 @@ -use std::{arch::asm, os::fd::{BorrowedFd, RawFd}}; - -use nix::{libc::STDIN_FILENO, sys::termios, unistd::isatty}; +use std::os::fd::{BorrowedFd, RawFd}; +use nix::{libc::STDIN_FILENO, sys::termios, unistd::{isatty, read, write}}; +use super::keys::{KeyCode, KeyEvent, ModKeys}; #[derive(Debug)] pub struct Terminal { @@ -11,92 +11,87 @@ pub struct Terminal { impl Terminal { pub fn new() -> Self { - assert!(isatty(0).unwrap()); + assert!(isatty(STDIN_FILENO).unwrap()); Self { - stdin: 0, + stdin: STDIN_FILENO, stdout: 1, } } + fn raw_mode() -> termios::Termios { - // Get the current terminal attributes - let orig_termios = unsafe { termios::tcgetattr(BorrowedFd::borrow_raw(STDIN_FILENO)).expect("Failed to get terminal attributes") }; - - // Make a mutable copy - let mut raw = orig_termios.clone(); - - // Apply raw mode flags - termios::cfmakeraw(&mut raw); - - // Set the attributes immediately - unsafe { termios::tcsetattr(BorrowedFd::borrow_raw(STDIN_FILENO), termios::SetArg::TCSANOW, &raw) } - .expect("Failed to set terminal to raw mode"); - - // Return original attributes so they can be restored later - orig_termios + let orig = termios::tcgetattr(unsafe{BorrowedFd::borrow_raw(STDIN_FILENO)}).expect("Failed to get terminal attributes"); + let mut raw = orig.clone(); + termios::cfmakeraw(&mut raw); + termios::tcsetattr(unsafe{BorrowedFd::borrow_raw(STDIN_FILENO)}, termios::SetArg::TCSANOW, &raw) + .expect("Failed to set terminal to raw mode"); + orig } + pub fn restore_termios(termios: termios::Termios) { - unsafe { termios::tcsetattr(BorrowedFd::borrow_raw(STDIN_FILENO), termios::SetArg::TCSANOW, &termios) } - .expect("Failed to restore terminal settings"); + termios::tcsetattr(unsafe{BorrowedFd::borrow_raw(STDIN_FILENO)}, termios::SetArg::TCSANOW, &termios) + .expect("Failed to restore terminal settings"); } - pub fn with_raw_mode R,R>(func: F) -> R { + + pub fn with_raw_mode R, R>(func: F) -> R { let saved = Self::raw_mode(); let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(func)); Self::restore_termios(saved); - match result { Ok(r) => r, - Err(e) => std::panic::resume_unwind(e) + Err(e) => std::panic::resume_unwind(e), } } + pub fn read_byte(&self, buf: &mut [u8]) -> usize { Self::with_raw_mode(|| { - let ret: usize; - unsafe { - let buf_ptr = buf.as_mut_ptr(); - let len = buf.len(); - asm! ( - "syscall", - in("rax") 0, - in("rdi") self.stdin, - in("rsi") buf_ptr, - in("rdx") len, - lateout("rax") ret, - out("rcx") _, - out("r11") _, - ); - } - ret + read(self.stdin, buf).expect("Failed to read from stdin") }) } + pub fn write_bytes(&self, buf: &[u8]) { Self::with_raw_mode(|| { - let _ret: usize; - unsafe { - let buf_ptr = buf.as_ptr(); - let len = buf.len(); - asm!( - "syscall", - in("rax") 1, - in("rdi") self.stdout, - in("rsi") buf_ptr, - in("rdx") len, - lateout("rax") _ret, - out("rcx") _, - out("r11") _, - ); - } + write(unsafe{BorrowedFd::borrow_raw(self.stdout)}, buf).expect("Failed to write to stdout"); }); } + + pub fn write(&self, s: &str) { self.write_bytes(s.as_bytes()); } + pub fn writeln(&self, s: &str) { self.write(s); self.write_bytes(b"\r\n"); } + pub fn clear(&self) { self.write_bytes(b"\x1b[2J\x1b[H"); } + + pub fn read_key(&self) -> KeyEvent { + let mut buf = [0;8]; + let n = self.read_byte(&mut buf); + + if buf[0] == 0x1b { + if n >= 3 && buf[1] == b'[' { + return match buf[2] { + b'A' => KeyEvent(KeyCode::Up, ModKeys::empty()), + b'B' => KeyEvent(KeyCode::Down, ModKeys::empty()), + b'C' => KeyEvent(KeyCode::Right, ModKeys::empty()), + b'D' => KeyEvent(KeyCode::Left, ModKeys::empty()), + _ => KeyEvent(KeyCode::Esc, ModKeys::empty()), + }; + } + return KeyEvent(KeyCode::Esc, ModKeys::empty()); + } + + if let Ok(s) = core::str::from_utf8(&buf[..n]) { + if let Some(ch) = s.chars().next() { + return KeyEvent::new(ch, ModKeys::NONE); + } + } + KeyEvent(KeyCode::Null, ModKeys::empty()) + } } impl Default for Terminal { From 25534d4cd96cd40393d59d9d6271adb30aec7705 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Tue, 20 May 2025 02:55:41 -0400 Subject: [PATCH 08/19] more work on vi line editing --- src/prompt/readline/line.rs | 339 ++++++++++++++++++++++++++++----- src/prompt/readline/linecmd.rs | 32 ++-- src/prompt/readline/mod.rs | 281 ++++++++++++++++++--------- src/prompt/readline/term.rs | 19 ++ 4 files changed, 519 insertions(+), 152 deletions(-) diff --git a/src/prompt/readline/line.rs b/src/prompt/readline/line.rs index 2f9c7e6..de3c310 100644 --- a/src/prompt/readline/line.rs +++ b/src/prompt/readline/line.rs @@ -1,6 +1,6 @@ use std::ops::Range; -use crate::{libsh::error::ShResult, prompt::readline::linecmd::Anchor}; +use crate::{libsh::{error::ShResult, term::{Style, Styled}}, prompt::readline::linecmd::Anchor}; use super::linecmd::{At, CharSearch, MoveCmd, Movement, Verb, VerbCmd, Word}; @@ -19,16 +19,91 @@ impl LineBuf { self.buffer = init.to_string().chars().collect(); self } + pub fn display_lines(&self) -> Vec { + let line_bullet = "∙ ".styled(Style::Dim); + self.split_lines() + .into_iter() + .enumerate() + .map(|(i, line)| { + if i == 0 { + line.to_string() + } else { + format!("{line_bullet}{line}") + } + }) + .collect() + } + pub fn repos_cursor(&mut self) { + if self.cursor >= self.len() { + self.cursor = self.len_minus_one(); + } + } + pub fn split_lines(&self) -> Vec { + let line = self.prepare_line(); + let mut lines = vec![]; + let mut cur_line = String::new(); + for ch in line.chars() { + match ch { + '\n' => lines.push(std::mem::take(&mut cur_line)), + _ => cur_line.push(ch) + } + } + lines.push(cur_line); + lines + } pub fn count_lines(&self) -> usize { self.buffer.iter().filter(|&&c| c == '\n').count() } pub fn cursor(&self) -> usize { self.cursor } + pub fn prepare_line(&self) -> String { + self.buffer + .iter() + .filter(|&&c| c != '\r') + .collect::() + } pub fn clear(&mut self) { self.buffer.clear(); self.cursor = 0; } + pub fn cursor_display_coords(&self) -> (usize, usize) { + let mut x = 0; + let mut y = 0; + for i in 0..self.cursor() { + let ch = self.get_char(i); + match ch { + '\n' => { + y += 1; + x = 0; + } + '\r' => continue, + _ => { + x += 1; + } + } + } + + (x, y) + } + pub fn cursor_real_coords(&self) -> (usize,usize) { + let mut x = 0; + let mut y = 0; + for i in 0..self.cursor() { + let ch = self.get_char(i); + match ch { + '\n' => { + y += 1; + x = 0; + } + _ => { + x += 1; + } + } + } + + (x, y) + } pub fn backspace(&mut self) { if self.cursor() == 0 { return @@ -46,14 +121,17 @@ impl LineBuf { if pos < self.cursor() { self.cursor = self.cursor.saturating_sub(1) } - if self.cursor() >= self.buffer.len() { - self.cursor = self.buffer.len().saturating_sub(1) - } + } + pub fn insert_at_pos(&mut self, pos: usize, ch: char) { + self.buffer.insert(pos, ch) } pub fn insert_at_cursor(&mut self, ch: char) { self.buffer.insert(self.cursor, ch); self.move_cursor_right(); } + pub fn insert_after_cursor(&mut self, ch: char) { + self.buffer.insert(self.cursor, ch); + } pub fn backspace_at_cursor(&mut self) { assert!(self.cursor <= self.buffer.len()); if self.buffer.is_empty() { @@ -108,11 +186,55 @@ impl LineBuf { pub fn len(&self) -> usize { self.buffer.len() } + pub fn len_minus_one(&self) -> usize { + self.buffer.len().saturating_sub(1) + } pub fn is_empty(&self) -> bool { self.buffer.is_empty() } - pub fn cursor_char(&self) -> char { - self.buffer[self.cursor] + pub fn cursor_char(&self) -> Option<&char> { + self.buffer.get(self.cursor()) + } + pub fn get_char(&self, pos: usize) -> char { + assert!((0..self.len()).contains(&pos)); + + self.buffer[pos] + } + pub fn prev_char(&self) -> Option { + if self.cursor() == 0 { + None + } else { + Some(self.get_char(self.cursor() - 1)) + } + } + pub fn next_char(&self) -> Option { + if self.cursor() == self.len_minus_one() { + None + } else { + Some(self.get_char(self.cursor() + 1)) + } + } + pub fn on_word_bound_left(&self) -> bool { + if self.cursor() == 0 { + return false + } + let Some(ch) = self.cursor_char() else { + return false + }; + let cur_char_class = CharClass::from(*ch); + let prev_char_pos = self.cursor().saturating_sub(1).max(0); + cur_char_class.is_opposite(self.get_char(prev_char_pos)) + } + pub fn on_word_bound_right(&self) -> bool { + if self.cursor() >= self.len_minus_one() { + return false + } + let Some(ch) = self.cursor_char() else { + return false + }; + let cur_char_class = CharClass::from(*ch); + let next_char_pos = self.cursor().saturating_add(1).min(self.len()); + cur_char_class.is_opposite(self.get_char(next_char_pos)) } fn backward_until bool>(&self, mut start: usize, cond: F) -> usize { while start > 0 && !cond(start) { @@ -126,7 +248,7 @@ impl LineBuf { } start } - pub fn calc_range(&self, movement: &Movement) -> Range { + pub fn calc_range(&mut self, movement: &Movement) -> Range { let mut start = self.cursor(); let mut end = self.cursor(); @@ -149,28 +271,73 @@ impl LineBuf { end = self.forward_until(end, |pos| self.buffer[pos] == '\n'); } Movement::BackwardWord(word) => { - let cur_char = self.cursor_char(); match word { Word::Big => { + if self.cursor_char().is_none() { + self.cursor = self.cursor.saturating_sub(1); + start = start.saturating_sub(1) + } + // Skip whitespace + let Some(cur_char) = self.cursor_char() else { + return start..end + }; if cur_char.is_whitespace() { start = self.backward_until(start, |pos| !self.buffer[pos].is_whitespace()) } + + let ch_class = CharClass::from(self.get_char(start)); + let should_step = self.prev_char().is_some_and(|ch| ch_class.is_opposite(ch)); + // If we are on a word boundary, move forward one character + // If we are now on whitespace, skip it + if should_step { + start = start.saturating_sub(1).max(0); + if self.get_char(start).is_whitespace() { + start = self.backward_until(start, |pos| !self.buffer[pos].is_whitespace()) + } + } start = self.backward_until(start, |pos| self.buffer[pos].is_whitespace()); - start += 1; + if self.get_char(start).is_whitespace() { + start += 1; + } } Word::Normal => { - if cur_char.is_alphanumeric() || cur_char == '_' { - start = self.backward_until(start, |pos| !(self.buffer[pos].is_alphanumeric() || self.buffer[pos] == '_')); - start += 1; - } else { - start = self.backward_until(start, |pos| (self.buffer[pos].is_alphanumeric() || self.buffer[pos] == '_')); + if self.cursor_char().is_none() { + self.cursor = self.cursor.saturating_sub(1); + start = start.saturating_sub(1) + } + let Some(cur_char) = self.cursor_char() else { + return start..end + }; + // Skip whitespace + if cur_char.is_whitespace() { + start = self.backward_until(start, |pos| !self.get_char(pos).is_whitespace()) + } + + let ch_class = CharClass::from(self.get_char(start)); + let should_step = self.prev_char().is_some_and(|ch| ch_class.is_opposite(ch)); + // If we are on a word boundary, move forward one character + // If we are now on whitespace, skip it + if should_step { + start = start.saturating_sub(1).max(0); + if self.get_char(start).is_whitespace() { + start = self.backward_until(start, |pos| !self.get_char(pos).is_whitespace()) + } + } + + // Find an alternate charclass to stop at + let cur_char = self.get_char(start); + let cur_char_class = CharClass::from(cur_char); + start = self.backward_until(start, |pos| cur_char_class.is_opposite(self.get_char(pos))); + if cur_char_class.is_opposite(self.get_char(start)) { start += 1; } } } } Movement::ForwardWord(at, word) => { - let cur_char = self.cursor_char(); + let Some(cur_char) = self.cursor_char() else { + return start..end + }; let is_ws = |pos: usize| self.buffer[pos].is_whitespace(); let not_ws = |pos: usize| !self.buffer[pos].is_whitespace(); @@ -178,38 +345,68 @@ impl LineBuf { Word::Big => { if cur_char.is_whitespace() { end = self.forward_until(end, not_ws); - } else { - end = self.forward_until(end, is_ws); - end = self.forward_until(end, not_ws); + } + + let ch_class = CharClass::from(self.buffer[end]); + let should_step = self.next_char().is_some_and(|ch| ch_class.is_opposite(ch)); + + if should_step { + end = end.saturating_add(1).min(self.len_minus_one()); + if self.get_char(end).is_whitespace() { + end = self.forward_until(end, |pos| !self.get_char(pos).is_whitespace()) + } } match at { - At::Start => {/* Done */} + At::Start => { + if !should_step { + end = self.forward_until(end, is_ws); + end = self.forward_until(end, not_ws); + } + } At::AfterEnd => { end = self.forward_until(end, is_ws); } At::BeforeEnd => { end = self.forward_until(end, is_ws); - end = end.saturating_sub(1); + if self.buffer.get(end).is_some_and(|ch| ch.is_whitespace()) { + end = end.saturating_sub(1); + } } } } Word::Normal => { - let ch_class = CharClass::from(self.buffer[end]); if cur_char.is_whitespace() { end = self.forward_until(end, not_ws); - } else { - end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])) + } + + let ch_class = CharClass::from(self.buffer[end]); + let should_step = self.next_char().is_some_and(|ch| ch_class.is_opposite(ch)); + + if should_step { + end = end.saturating_add(1).min(self.len_minus_one()); + if self.get_char(end).is_whitespace() { + end = self.forward_until(end, |pos| !self.get_char(pos).is_whitespace()) + } } match at { - At::Start => {/* Done */ } + At::Start => { + if !should_step { + end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])); + if self.get_char(end).is_whitespace() { + end = self.forward_until(end, |pos| !self.get_char(pos).is_whitespace()) + } + } + } At::AfterEnd => { end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])); } At::BeforeEnd => { end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])); - end = end.saturating_sub(1); + if self.buffer.get(end).is_some_and(|ch| ch.is_whitespace()) { + end = end.saturating_sub(1); + } } } } @@ -225,51 +422,58 @@ impl LineBuf { Movement::CharSearch(char_search) => { match char_search { CharSearch::FindFwd(ch) => { - let search = self.forward_until(end, |pos| self.buffer[pos] == *ch); + let ch = ch.unwrap(); + end = end.saturating_add(1).min(self.len_minus_one()); + let search = self.forward_until(end, |pos| self.buffer[pos] == ch); // we check anyway because it may have reached the end without finding anything - if self.buffer[search] == *ch { + if self.buffer.get(search).is_some_and(|&s_ch| s_ch == ch) { end = search; } } CharSearch::FwdTo(ch) => { - let search = self.forward_until(end, |pos| self.buffer[pos] == *ch); + let ch = ch.unwrap(); + end = end.saturating_add(1).min(self.len_minus_one()); + let search = self.forward_until(end, |pos| self.buffer[pos] == ch); // we check anyway because it may have reached the end without finding anything - if self.buffer[search] == *ch { + if self.buffer.get(search).is_some_and(|&s_ch| s_ch == ch) { end = search.saturating_sub(1); } } CharSearch::FindBkwd(ch) => { - let search = self.forward_until(start, |pos| self.buffer[pos] == *ch); + let ch = ch.unwrap(); + start = start.saturating_sub(1); + let search = self.backward_until(start, |pos| self.buffer[pos] == ch); // we check anyway because it may have reached the end without finding anything - if self.buffer[search] == *ch { + if self.buffer.get(search).is_some_and(|&s_ch| s_ch == ch) { start = search; } } CharSearch::BkwdTo(ch) => { - let search = self.forward_until(start, |pos| self.buffer[pos] == *ch); + let ch = ch.unwrap(); + start = start.saturating_sub(1); + let search = self.backward_until(start, |pos| self.buffer[pos] == ch); // we check anyway because it may have reached the end without finding anything - if self.buffer[search] == *ch { + if self.buffer.get(search).is_some_and(|&s_ch| s_ch == ch) { start = search.saturating_add(1); } } } } - Movement::ViFirstPrint => todo!(), Movement::LineUp => todo!(), Movement::LineDown => todo!(), Movement::WholeBuffer => { start = 0; - end = self.len().saturating_sub(1); + end = self.len_minus_one(); } Movement::BeginningOfBuffer => { start = 0; } Movement::EndOfBuffer => { - end = self.len().saturating_sub(1); + end = self.len_minus_one(); } Movement::Null => {/* nothing */} } @@ -299,6 +503,22 @@ impl LineBuf { } } } + Verb::Breakline(anchor) => { + match anchor { + Anchor::Before => { + let last_newline = self.backward_until(self.cursor(), |pos| self.get_char(pos) == '\n'); + self.cursor = last_newline; + self.insert_at_cursor('\n'); + self.insert_at_cursor('\r'); + } + Anchor::After => { + let next_newline = self.forward_until(self.cursor(), |pos| self.get_char(pos) == '\n'); + self.cursor = next_newline; + self.insert_at_cursor('\n'); + self.insert_at_cursor('\r'); + } + } + } Verb::InsertChar(ch) => self.insert_at_cursor(ch), Verb::InsertMode => todo!(), Verb::JoinLines => todo!(), @@ -308,8 +528,22 @@ impl LineBuf { Verb::Put(_) => todo!(), Verb::Undo => todo!(), Verb::RepeatLast => todo!(), - Verb::Dedent => todo!(), - Verb::Indent => todo!(), + Verb::Dedent => { + let mut start_pos = self.backward_until(self.cursor(), |pos| self.get_char(pos) == '\n'); + if self.get_char(start_pos) == '\n' { + start_pos += 1; + } + if self.get_char(start_pos) == '\t' { + self.delete_pos(start_pos); + } + } + Verb::Indent => { + let mut line_start = self.backward_until(self.cursor(), |pos| self.get_char(pos) == '\n'); + if self.get_char(line_start) == '\n' { + line_start += 1; + } + self.insert_at_pos(line_start, '\t'); + } Verb::ReplaceChar(_) => todo!(), _ => unreachable!() } @@ -333,10 +567,21 @@ impl LineBuf { Verb::Delete => { (0..move_count).for_each(|_| { let range = self.calc_range(&movement); + let range = range.start..(range.end + 1).min(self.len()); + self.buffer.drain(range); + self.repos_cursor(); + }); + } + Verb::Change => { + (0..move_count).for_each(|_| { + let range = self.calc_range(&movement); + let range = range.start..(range.end + 1).min(self.len()); + self.buffer.drain(range); + self.repos_cursor(); }); } Verb::DeleteOne(anchor) => todo!(), - Verb::Change => todo!(), + Verb::Breakline(anchor) => todo!(), Verb::Yank => todo!(), Verb::ReplaceChar(_) => todo!(), Verb::Substitute => todo!(), @@ -358,13 +603,13 @@ impl LineBuf { #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub enum CharClass { AlphaNum, - Symbol + Symbol, } impl CharClass { - pub fn is_opposite(&self, ch: char) -> bool { - let opp_class = CharClass::from(ch); - opp_class != *self + pub fn is_opposite(&self, other: char) -> bool { + let other_class = CharClass::from(other); + other_class != *self } } @@ -379,7 +624,7 @@ impl From for CharClass { } -pub fn strip_ansi_codes(s: &str) -> String { +pub fn strip_ansi_codes_and_escapes(s: &str) -> String { let mut out = String::with_capacity(s.len()); let mut chars = s.chars().peekable(); @@ -395,7 +640,11 @@ pub fn strip_ansi_codes(s: &str) -> String { chars.next(); // consume intermediate characters } } else { - out.push(c); + match c { + '\n' | + '\r' => { /* Continue */ } + _ => out.push(c) + } } } out diff --git a/src/prompt/readline/linecmd.rs b/src/prompt/readline/linecmd.rs index c8ed00d..e3058bb 100644 --- a/src/prompt/readline/linecmd.rs +++ b/src/prompt/readline/linecmd.rs @@ -34,6 +34,18 @@ impl ViCmdBuilder { let Self { verb_count, verb, move_count, movement: _ } = self; Self { verb_count, verb, move_count, movement: Some(movement) } } + pub fn verb_count(&self) -> Option { + self.verb_count + } + pub fn move_count(&self) -> Option { + self.move_count + } + pub fn movement(&self) -> Option<&Movement> { + self.movement.as_ref() + } + pub fn verb(&self) -> Option<&Verb> { + self.verb.as_ref() + } pub fn append_digit(&mut self, digit: char) { // Convert char digit to a number (assuming ASCII '0'..'9') let digit_val = digit.to_digit(10).expect("digit must be 0-9") as u16; @@ -128,6 +140,7 @@ pub enum Verb { /// `J` — join lines JoinLines, InsertChar(char), + Breakline(Anchor), Indent, Dedent } @@ -147,6 +160,7 @@ impl Verb { Verb::Dedent | Verb::Indent | Verb::InsertChar(_) | + Verb::Breakline(_) | Verb::ReplaceChar(_) => false, Verb::Delete | Verb::Change | @@ -171,8 +185,6 @@ pub enum Movement { ForwardWord(At, Word), // Forward until start/end of word /// character-search, character-search-backward, vi-char-search CharSearch(CharSearch), - /// vi-first-print - ViFirstPrint, /// backward-char BackwardChar, /// forward-char @@ -200,7 +212,6 @@ impl Movement { Self::BackwardWord(_) | Self::ForwardWord(_, _) | Self::CharSearch(_) | - Self::ViFirstPrint | Self::BackwardChar | Self::ForwardChar | Self::LineUp | @@ -334,10 +345,10 @@ pub enum Anchor { #[derive(Debug, Clone, Eq, PartialEq, Copy)] pub enum CharSearch { - FindFwd(char), - FwdTo(char), - FindBkwd(char), - BkwdTo(char) + FindFwd(Option), + FwdTo(Option), + FindBkwd(Option), + BkwdTo(Option), } #[derive(Debug, Clone, Eq, PartialEq, Copy)] @@ -347,13 +358,6 @@ pub enum Word { } -const fn repeat_count(previous: RepeatCount, new: Option) -> RepeatCount { - match new { - Some(n) => n, - None => previous, - } -} - #[derive(Default,Debug,Clone,Copy,PartialEq,Eq,PartialOrd,Ord)] pub enum InputMode { Normal, diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index f0dd33d..afaf32b 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -1,8 +1,8 @@ use std::{arch::asm, os::fd::BorrowedFd}; use keys::KeyEvent; -use line::{strip_ansi_codes, LineBuf}; -use linecmd::{Anchor, At, InputMode, LineCmd, MoveCmd, Movement, Verb, VerbCmd, ViCmd, ViCmdBuilder, Word}; +use line::{strip_ansi_codes_and_escapes, LineBuf}; +use linecmd::{Anchor, At, CharSearch, InputMode, LineCmd, MoveCmd, Movement, Verb, VerbCmd, ViCmd, ViCmdBuilder, Word}; use nix::{libc::STDIN_FILENO, sys::termios::{self, Termios}, unistd::read}; use term::Terminal; use unicode_width::UnicodeWidthStr; @@ -13,6 +13,33 @@ pub mod line; pub mod keys; pub mod linecmd; +/// Add a verb to a specified ViCmdBuilder, then build it +/// +/// Returns the built value as a LineCmd::ViCmd +macro_rules! build_verb { + ($cmd:expr,$verb:expr) => {{ + $cmd.with_verb($verb).build().map(|cmd| LineCmd::ViCmd(cmd)) + }} +} + +/// Add a movement to a specified ViCmdBuilder, then build it +/// +/// Returns the built value as a LineCmd::ViCmd +macro_rules! build_movement { + ($cmd:expr,$move:expr) => {{ + $cmd.with_movement($move).build().map(|cmd| LineCmd::ViCmd(cmd)) + }} +} + +/// Add both a movement and a verb to a specified ViCmdBuilder, then build it +/// +/// Returns the built value as a LineCmd::ViCmd +macro_rules! build_moveverb { + ($cmd:expr,$verb:expr,$move:expr) => {{ + $cmd.with_movement($move).with_verb($verb).build().map(|cmd| LineCmd::ViCmd(cmd)) + }} +} + #[derive(Default,Debug)] pub struct FernReader { pub term: Terminal, @@ -70,19 +97,50 @@ impl FernReader { } let mut prompt_lines = self.prompt.lines().peekable(); let mut last_line_len = 0; + let lines = self.line.display_lines(); while let Some(line) = prompt_lines.next() { if prompt_lines.peek().is_none() { - last_line_len = strip_ansi_codes(line).width(); + last_line_len = strip_ansi_codes_and_escapes(line).width(); self.term.write(line); } else { self.term.writeln(line); } } - let line = self.pack_line(); - self.term.write(&line); + let num_lines = lines.len(); + let mut lines_iter = lines.into_iter().peekable(); - let cursor_offset = self.line.cursor() + last_line_len; - self.term.write(&format!("\r\x1b[{}C", cursor_offset)); + while let Some(line) = lines_iter.next() { + if lines_iter.peek().is_some() { + self.term.writeln(&line); + } else { + self.term.write(&line); + } + } + + if num_lines == 1 { + let cursor_offset = self.line.cursor() + last_line_len; + self.term.write(&format!("\r\x1b[{}C", cursor_offset)); + } else { + let (x, y) = self.line.cursor_display_coords(); + // Y-axis movements are 1-indexed and must move up from the bottom + // Therefore, add 1 to Y and subtract that number from the number of lines + // to find the number of times we have to push the cursor upward + let y = num_lines.saturating_sub(y+1); + if y > 0 { + self.term.write(&format!("\r\x1b[{}A", y)) + } + self.term.write(&format!("\r\x1b[{}C", x+2)); // Factor in the line bullet thing + } + match self.edit_mode { + InputMode::Replace | + InputMode::Insert => { + self.term.write("\x1b[6 q") + } + InputMode::Normal | + InputMode::Visual => { + self.term.write("\x1b[2 q") + } + } } pub fn next_cmd(&mut self) -> ShResult { let vi_cmd = ViCmdBuilder::new(); @@ -97,12 +155,7 @@ impl FernReader { use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; let key = self.term.read_key(); let cmd = match key { - E(K::Char(ch), M::NONE) => { - let cmd = pending_cmd - .with_verb(Verb::InsertChar(ch)) - .build()?; - LineCmd::ViCmd(cmd) - } + E(K::Char(ch), M::NONE) => build_verb!(pending_cmd, Verb::InsertChar(ch))?, E(K::Char('H'), M::CTRL) | E(K::Backspace, M::NONE) => LineCmd::backspace(), @@ -114,10 +167,7 @@ impl FernReader { E(K::Esc, M::NONE) => { self.edit_mode = InputMode::Normal; - let cmd = pending_cmd - .with_movement(Movement::BackwardChar) - .build()?; - LineCmd::ViCmd(cmd) + build_movement!(pending_cmd, Movement::BackwardChar)? } E(K::Char('D'), M::CTRL) => LineCmd::EndOfFile, _ => { @@ -131,6 +181,31 @@ impl FernReader { pub fn get_normal_cmd(&mut self, mut pending_cmd: ViCmdBuilder) -> ShResult { use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; let key = self.term.read_key(); + + if let E(K::Char(ch), M::NONE) = key { + if pending_cmd.movement().is_some_and(|m| matches!(m, Movement::CharSearch(_))) { + let Movement::CharSearch(charsearch) = pending_cmd.movement().unwrap() else {unreachable!()}; + match charsearch { + CharSearch::FindFwd(_) => { + let finalized = CharSearch::FindFwd(Some(ch)); + return build_movement!(pending_cmd, Movement::CharSearch(finalized)) + } + CharSearch::FwdTo(_) => { + let finalized = CharSearch::FwdTo(Some(ch)); + return build_movement!(pending_cmd, Movement::CharSearch(finalized)) + } + CharSearch::FindBkwd(_) => { + let finalized = CharSearch::FindBkwd(Some(ch)); + return build_movement!(pending_cmd, Movement::CharSearch(finalized)) + } + CharSearch::BkwdTo(_) => { + let finalized = CharSearch::BkwdTo(Some(ch)); + return build_movement!(pending_cmd, Movement::CharSearch(finalized)) + } + } + } + } + if let E(K::Char(digit @ '0'..='9'), M::NONE) = key { pending_cmd.append_digit(digit); return self.get_normal_cmd(pending_cmd); @@ -144,55 +219,91 @@ impl FernReader { } E(K::Char('j'), M::NONE) => LineCmd::LineDownOrNextHistory, E(K::Char('k'), M::NONE) => LineCmd::LineUpOrPreviousHistory, - E(K::Char('l'), M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::ForwardChar) - .build()?; - LineCmd::ViCmd(cmd) + E(K::Char('D'), M::NONE) => build_moveverb!(pending_cmd,Verb::Delete,Movement::EndOfLine)?, + E(K::Char('C'), M::NONE) => build_moveverb!(pending_cmd,Verb::Change,Movement::EndOfLine)?, + E(K::Char('Y'), M::NONE) => build_moveverb!(pending_cmd,Verb::Yank,Movement::EndOfLine)?, + E(K::Char('l'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardChar)?, + E(K::Char('w'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardWord(At::Start, Word::Normal))?, + E(K::Char('W'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardWord(At::Start, Word::Big))?, + E(K::Char('b'), M::NONE) => build_movement!(pending_cmd,Movement::BackwardWord(Word::Normal))?, + E(K::Char('B'), M::NONE) => build_movement!(pending_cmd,Movement::BackwardWord(Word::Big))?, + E(K::Char('e'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardWord(At::BeforeEnd, Word::Normal))?, + E(K::Char('E'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardWord(At::BeforeEnd, Word::Big))?, + E(K::Char('^'), M::NONE) => build_movement!(pending_cmd,Movement::BeginningOfFirstWord)?, + E(K::Char('0'), M::NONE) => build_movement!(pending_cmd,Movement::BeginningOfLine)?, + E(K::Char('$'), M::NONE) => build_movement!(pending_cmd,Movement::EndOfLine)?, + E(K::Char('x'), M::NONE) => build_verb!(pending_cmd,Verb::DeleteOne(Anchor::After))?, + E(K::Char('o'), M::NONE) => { + self.edit_mode = InputMode::Insert; + build_verb!(pending_cmd,Verb::Breakline(Anchor::After))? } - E(K::Char('w'), M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::ForwardWord(At::Start, Word::Normal)) - .build()?; - LineCmd::ViCmd(cmd) - } - E(K::Char('W'), M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::ForwardWord(At::Start, Word::Big)) - .build()?; - LineCmd::ViCmd(cmd) - } - E(K::Char('b'), M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::BackwardWord(Word::Normal)) - .build()?; - LineCmd::ViCmd(cmd) - } - E(K::Char('B'), M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::BackwardWord(Word::Big)) - .build()?; - LineCmd::ViCmd(cmd) - } - E(K::Char('x'), M::NONE) => { - let cmd = pending_cmd - .with_verb(Verb::DeleteOne(Anchor::After)) - .build()?; - LineCmd::ViCmd(cmd) + E(K::Char('O'), M::NONE) => { + self.edit_mode = InputMode::Insert; + build_verb!(pending_cmd,Verb::Breakline(Anchor::Before))? } E(K::Char('i'), M::NONE) => { self.edit_mode = InputMode::Insert; - let cmd = pending_cmd - .with_movement(Movement::BackwardChar) - .build()?; - LineCmd::ViCmd(cmd) + LineCmd::Null } E(K::Char('I'), M::NONE) => { self.edit_mode = InputMode::Insert; - let cmd = pending_cmd - .with_movement(Movement::BeginningOfFirstWord) - .build()?; - LineCmd::ViCmd(cmd) + build_movement!(pending_cmd,Movement::BeginningOfFirstWord)? + } + E(K::Char('a'), M::NONE) => { + self.edit_mode = InputMode::Insert; + build_movement!(pending_cmd,Movement::ForwardChar)? + } + E(K::Char('A'), M::NONE) => { + self.edit_mode = InputMode::Insert; + build_movement!(pending_cmd,Movement::EndOfLine)? + } + E(K::Char('c'), M::NONE) => { + if pending_cmd.verb() == Some(&Verb::Change) { + build_moveverb!(pending_cmd,Verb::Change,Movement::WholeLine)? + } else { + pending_cmd = pending_cmd.with_verb(Verb::Change); + self.get_normal_cmd(pending_cmd)? + } + } + E(K::Char('>'), M::NONE) => { + if pending_cmd.verb() == Some(&Verb::Indent) { + build_verb!(pending_cmd,Verb::Indent)? + } else { + pending_cmd = pending_cmd.with_verb(Verb::Indent); + self.get_normal_cmd(pending_cmd)? + } + } + E(K::Char('<'), M::NONE) => { + if pending_cmd.verb() == Some(&Verb::Dedent) { + build_verb!(pending_cmd,Verb::Dedent)? + } else { + pending_cmd = pending_cmd.with_verb(Verb::Dedent); + self.get_normal_cmd(pending_cmd)? + } + } + E(K::Char('d'), M::NONE) => { + if pending_cmd.verb() == Some(&Verb::Delete) { + LineCmd::ViCmd(pending_cmd.with_movement(Movement::WholeLine).build()?) + } else { + pending_cmd = pending_cmd.with_verb(Verb::Delete); + self.get_normal_cmd(pending_cmd)? + } + } + E(K::Char('f'), M::NONE) => { + pending_cmd = pending_cmd.with_movement(Movement::CharSearch(CharSearch::FindFwd(None))); + self.get_normal_cmd(pending_cmd)? + } + E(K::Char('F'), M::NONE) => { + pending_cmd = pending_cmd.with_movement(Movement::CharSearch(CharSearch::FindBkwd(None))); + self.get_normal_cmd(pending_cmd)? + } + E(K::Char('t'), M::NONE) => { + pending_cmd = pending_cmd.with_movement(Movement::CharSearch(CharSearch::FwdTo(None))); + self.get_normal_cmd(pending_cmd)? + } + E(K::Char('T'), M::NONE) => { + pending_cmd = pending_cmd.with_movement(Movement::CharSearch(CharSearch::BkwdTo(None))); + self.get_normal_cmd(pending_cmd)? } _ => { flog!(INFO, "unhandled key in get_normal_cmd, trying common_cmd..."); @@ -205,44 +316,18 @@ impl FernReader { pub fn common_cmd(&mut self, key: KeyEvent, pending_cmd: ViCmdBuilder) -> ShResult { use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; match key { - E(K::Home, M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::BeginningOfLine) - .build()?; - Ok(LineCmd::ViCmd(cmd)) - } - E(K::End, M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::EndOfLine) - .build()?; - Ok(LineCmd::ViCmd(cmd)) - } - E(K::Left, M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::BackwardChar) - .build()?; - Ok(LineCmd::ViCmd(cmd)) - } - E(K::Right, M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::ForwardChar) - .build()?; - Ok(LineCmd::ViCmd(cmd)) - } - E(K::Delete, M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::ForwardChar) - .with_verb(Verb::Delete) - .build()?; - Ok(LineCmd::ViCmd(cmd)) - } + E(K::Home, M::NONE) => build_movement!(pending_cmd,Movement::BeginningOfLine), + E(K::End, M::NONE) => build_movement!(pending_cmd,Movement::EndOfLine), + E(K::Left, M::NONE) => build_movement!(pending_cmd,Movement::BackwardChar), + E(K::Right, M::NONE) => build_movement!(pending_cmd,Movement::ForwardChar), + E(K::Delete, M::NONE) => build_moveverb!(pending_cmd,Verb::Delete,Movement::ForwardChar), + E(K::Up, M::NONE) => Ok(LineCmd::LineUpOrPreviousHistory), + E(K::Down, M::NONE) => Ok(LineCmd::LineDownOrNextHistory), + E(K::Enter, M::NONE) => Ok(LineCmd::AcceptLine), E(K::Backspace, M::NONE) | E(K::Char('h'), M::CTRL) => { Ok(LineCmd::backspace()) } - E(K::Up, M::NONE) => Ok(LineCmd::LineUpOrPreviousHistory), - E(K::Down, M::NONE) => Ok(LineCmd::LineDownOrNextHistory), - E(K::Enter, M::NONE) => Ok(LineCmd::AcceptLine), _ => Err(ShErr::simple(ShErrKind::ReadlineErr,format!("Unhandled common key event: {key:?}"))) } } @@ -251,10 +336,14 @@ impl FernReader { ViCmd::MoveVerb(verb_cmd, move_cmd) => { self.last_effect = Some(verb_cmd.clone()); self.last_movement = Some(move_cmd.clone()); + let VerbCmd { verb_count, verb } = verb_cmd; for _ in 0..verb_count { self.line.exec_vi_cmd(Some(verb.clone()), Some(move_cmd.clone()))?; } + if verb == Verb::Change { + self.edit_mode = InputMode::Insert + } } ViCmd::Verb(verb_cmd) => { self.last_effect = Some(verb_cmd.clone()); @@ -318,3 +407,9 @@ impl FernReader { } } +impl Drop for FernReader { + fn drop(&mut self) { + self.term.write("\x1b[2 q"); + } +} + diff --git a/src/prompt/readline/term.rs b/src/prompt/readline/term.rs index 2dfe977..a402bfd 100644 --- a/src/prompt/readline/term.rs +++ b/src/prompt/readline/term.rs @@ -92,6 +92,25 @@ impl Terminal { } KeyEvent(KeyCode::Null, ModKeys::empty()) } + + pub fn cursor_pos(&self) -> (usize, usize) { + self.write("\x1b[6n"); + let mut buf = [0u8;32]; + let n = self.read_byte(&mut buf); + + + let response = std::str::from_utf8(&buf[..n]).unwrap_or(""); + let mut row = 0; + let mut col = 0; + if let Some(caps) = response.strip_prefix("\x1b[").and_then(|s| s.strip_suffix("R")) { + let mut parts = caps.split(';'); + if let (Some(rowstr), Some(colstr)) = (parts.next(), parts.next()) { + row = rowstr.parse().unwrap_or(1); + col = colstr.parse().unwrap_or(1); + } + } + (row,col) + } } impl Default for Terminal { From 47759a05d469203f817d58625e3973f72e3d8030 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Tue, 20 May 2025 18:03:43 -0400 Subject: [PATCH 09/19] continued work on vi line editing --- src/prompt/readline/line.rs | 31 ++++++++++++++++++-- src/prompt/readline/linecmd.rs | 52 +++++++++++++++++++++++++++++++++ src/prompt/readline/mod.rs | 53 +++++++++++++++++++++------------- 3 files changed, 114 insertions(+), 22 deletions(-) diff --git a/src/prompt/readline/line.rs b/src/prompt/readline/line.rs index de3c310..e3566e9 100644 --- a/src/prompt/readline/line.rs +++ b/src/prompt/readline/line.rs @@ -2,12 +2,14 @@ use std::ops::Range; use crate::{libsh::{error::ShResult, term::{Style, Styled}}, prompt::readline::linecmd::Anchor}; -use super::linecmd::{At, CharSearch, MoveCmd, Movement, Verb, VerbCmd, Word}; +use super::linecmd::{At, CharSearch, MoveCmd, Movement, Repeat, Verb, VerbCmd, Word}; #[derive(Default,Debug)] pub struct LineBuf { pub buffer: Vec, + pub inserting: bool, + pub last_insert: String, cursor: usize } @@ -19,6 +21,15 @@ impl LineBuf { self.buffer = init.to_string().chars().collect(); self } + pub fn begin_insert(&mut self) { + self.inserting = true; + } + pub fn finish_insert(&mut self) { + self.inserting = false; + } + pub fn take_ins_text(&mut self) -> String { + std::mem::take(&mut self.last_insert) + } pub fn display_lines(&self) -> Vec { let line_bullet = "∙ ".styled(Style::Dim); self.split_lines() @@ -519,7 +530,20 @@ impl LineBuf { } } } - Verb::InsertChar(ch) => self.insert_at_cursor(ch), + Verb::InsertChar(ch) => { + if self.inserting { + self.last_insert.push(ch); + } + self.insert_at_cursor(ch) + } + Verb::Insert(text) => { + for ch in text.chars() { + if self.inserting { + self.last_insert.push(ch); + } + self.insert_at_cursor(ch); + } + } Verb::InsertMode => todo!(), Verb::JoinLines => todo!(), Verb::ToggleCase => todo!(), @@ -579,6 +603,9 @@ impl LineBuf { self.buffer.drain(range); self.repos_cursor(); }); + } + Verb::Repeat(rep) => { + } Verb::DeleteOne(anchor) => todo!(), Verb::Breakline(anchor) => todo!(), diff --git a/src/prompt/readline/linecmd.rs b/src/prompt/readline/linecmd.rs index e3058bb..c5c72c0 100644 --- a/src/prompt/readline/linecmd.rs +++ b/src/prompt/readline/linecmd.rs @@ -110,6 +110,54 @@ pub struct MoveCmd { pub movement: Movement } +#[derive(Default, Debug, Clone, Eq, PartialEq)] +pub struct Repeat { + pub movement: Option, + pub verb: Option>, + pub ins_text: Option +} + +impl Repeat { + pub fn from_cmd(cmd: ViCmd) -> Self { + match cmd { + ViCmd::MoveVerb(verb_cmd, move_cmd) => { + Self { + movement: Some(move_cmd), + verb: Some(Box::new(verb_cmd)), + ins_text: None, + } + } + ViCmd::Verb(verb_cmd) => { + Self { + movement: None, + verb: Some(Box::new(verb_cmd)), + ins_text: None, + } + } + ViCmd::Move(move_cmd) => { + Self { + movement: Some(move_cmd), + verb: None, + ins_text: None, + } + } + } + } + pub fn set_ins_text(&mut self, ins_text: String) { + self.ins_text = Some(ins_text); + } + fn is_empty(&self) -> bool { + self.movement.is_none() && self.verb.is_none() && self.ins_text.is_none() + } + pub fn to_option(self) -> Option { + if self.is_empty() { + None + } else { + Some(self) + } + } +} + #[derive(Debug, Clone, Eq, PartialEq)] #[non_exhaustive] pub enum Verb { @@ -139,7 +187,9 @@ pub enum Verb { InsertMode, /// `J` — join lines JoinLines, + Repeat(Repeat), InsertChar(char), + Insert(String), Breakline(Anchor), Indent, Dedent @@ -161,6 +211,8 @@ impl Verb { Verb::Indent | Verb::InsertChar(_) | Verb::Breakline(_) | + Verb::Repeat(_) | + Verb::Insert(_) | Verb::ReplaceChar(_) => false, Verb::Delete | Verb::Change | diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index afaf32b..6d130d0 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -8,6 +8,7 @@ use term::Terminal; use unicode_width::UnicodeWidthStr; use crate::{libsh::{error::{ShErr, ShErrKind, ShResult}, sys::sh_quit}, prelude::*}; +use linecmd::Repeat; pub mod term; pub mod line; pub mod keys; @@ -46,9 +47,7 @@ pub struct FernReader { pub prompt: String, pub line: LineBuf, pub edit_mode: InputMode, - pub count_arg: u16, - pub last_effect: Option, - pub last_movement: Option + pub last_vicmd: Option, } impl FernReader { @@ -59,9 +58,7 @@ impl FernReader { prompt, line, edit_mode: Default::default(), - count_arg: Default::default(), - last_effect: Default::default(), - last_movement: Default::default(), + last_vicmd: Default::default() } } fn pack_line(&mut self) -> String { @@ -142,6 +139,16 @@ impl FernReader { } } } + pub fn set_normal_mode(&mut self) { + self.edit_mode = InputMode::Normal; + self.line.finish_insert(); + let ins_text = self.line.take_ins_text(); + self.last_vicmd.as_mut().map(|cmd| cmd.set_ins_text(ins_text)); + } + pub fn set_insert_mode(&mut self) { + self.edit_mode = InputMode::Insert; + self.line.begin_insert(); + } pub fn next_cmd(&mut self) -> ShResult { let vi_cmd = ViCmdBuilder::new(); match self.edit_mode { @@ -166,10 +173,8 @@ impl FernReader { E(K::Tab, M::NONE) => LineCmd::Complete, E(K::Esc, M::NONE) => { - self.edit_mode = InputMode::Normal; build_movement!(pending_cmd, Movement::BackwardChar)? } - E(K::Char('D'), M::CTRL) => LineCmd::EndOfFile, _ => { flog!(INFO, "unhandled key in get_insert_cmd, trying common_cmd..."); return self.common_cmd(key, pending_cmd) @@ -217,6 +222,14 @@ impl FernReader { .build()?; LineCmd::ViCmd(cmd) } + E(K::Char('.'), M::NONE) => { + match &self.last_vicmd { + None => LineCmd::Null, + Some(cmd) => { + build_verb!(pending_cmd, Verb::Repeat(cmd.clone()))? + } + } + } E(K::Char('j'), M::NONE) => LineCmd::LineDownOrNextHistory, E(K::Char('k'), M::NONE) => LineCmd::LineUpOrPreviousHistory, E(K::Char('D'), M::NONE) => build_moveverb!(pending_cmd,Verb::Delete,Movement::EndOfLine)?, @@ -234,27 +247,27 @@ impl FernReader { E(K::Char('$'), M::NONE) => build_movement!(pending_cmd,Movement::EndOfLine)?, E(K::Char('x'), M::NONE) => build_verb!(pending_cmd,Verb::DeleteOne(Anchor::After))?, E(K::Char('o'), M::NONE) => { - self.edit_mode = InputMode::Insert; + self.set_insert_mode(); build_verb!(pending_cmd,Verb::Breakline(Anchor::After))? } E(K::Char('O'), M::NONE) => { - self.edit_mode = InputMode::Insert; + self.set_insert_mode(); build_verb!(pending_cmd,Verb::Breakline(Anchor::Before))? } E(K::Char('i'), M::NONE) => { - self.edit_mode = InputMode::Insert; + self.set_insert_mode(); LineCmd::Null } E(K::Char('I'), M::NONE) => { - self.edit_mode = InputMode::Insert; + self.set_insert_mode(); build_movement!(pending_cmd,Movement::BeginningOfFirstWord)? } E(K::Char('a'), M::NONE) => { - self.edit_mode = InputMode::Insert; + self.set_insert_mode(); build_movement!(pending_cmd,Movement::ForwardChar)? } E(K::Char('A'), M::NONE) => { - self.edit_mode = InputMode::Insert; + self.set_insert_mode(); build_movement!(pending_cmd,Movement::EndOfLine)? } E(K::Char('c'), M::NONE) => { @@ -324,6 +337,7 @@ impl FernReader { E(K::Up, M::NONE) => Ok(LineCmd::LineUpOrPreviousHistory), E(K::Down, M::NONE) => Ok(LineCmd::LineDownOrNextHistory), E(K::Enter, M::NONE) => Ok(LineCmd::AcceptLine), + E(K::Char('D'), M::CTRL) => Ok(LineCmd::EndOfFile), E(K::Backspace, M::NONE) | E(K::Char('h'), M::CTRL) => { Ok(LineCmd::backspace()) @@ -331,29 +345,28 @@ impl FernReader { _ => Err(ShErr::simple(ShErrKind::ReadlineErr,format!("Unhandled common key event: {key:?}"))) } } + pub fn handle_repeat(&mut self, cmd: &ViCmd) -> ShResult<()> { + Ok(()) + } pub fn exec_vi_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { + self.last_vicmd = Some(Repeat::from_cmd(cmd.clone())); match cmd { ViCmd::MoveVerb(verb_cmd, move_cmd) => { - self.last_effect = Some(verb_cmd.clone()); - self.last_movement = Some(move_cmd.clone()); - let VerbCmd { verb_count, verb } = verb_cmd; for _ in 0..verb_count { self.line.exec_vi_cmd(Some(verb.clone()), Some(move_cmd.clone()))?; } if verb == Verb::Change { - self.edit_mode = InputMode::Insert + self.set_insert_mode(); } } ViCmd::Verb(verb_cmd) => { - self.last_effect = Some(verb_cmd.clone()); let VerbCmd { verb_count, verb } = verb_cmd; for _ in 0..verb_count { self.line.exec_vi_cmd(Some(verb.clone()), None)?; } } ViCmd::Move(move_cmd) => { - self.last_movement = Some(move_cmd.clone()); self.line.exec_vi_cmd(None, Some(move_cmd))?; } } From ac170d31c828f7c5eb93737e162a294db32f40c0 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Thu, 22 May 2025 03:36:27 -0400 Subject: [PATCH 10/19] further work on implementing vi features --- Cargo.lock | 7 + Cargo.toml | 1 + src/prompt/mod.rs | 4 +- src/prompt/readline/keys.rs | 129 ++++-- src/prompt/readline/line.rs | 678 --------------------------- src/prompt/readline/linebuf.rs | 798 ++++++++++++++++++++++++++++++++ src/prompt/readline/linecmd.rs | 420 ----------------- src/prompt/readline/mod.rs | 444 +++--------------- src/prompt/readline/mode.rs | 360 ++++++++++++++ src/prompt/readline/register.rs | 171 +++++++ src/prompt/readline/term.rs | 103 ++++- src/prompt/readline/vicmd.rs | 294 ++++++++++++ src/prompt/readline_old.rs | 86 ---- 13 files changed, 1871 insertions(+), 1624 deletions(-) delete mode 100644 src/prompt/readline/line.rs create mode 100644 src/prompt/readline/linebuf.rs delete mode 100644 src/prompt/readline/linecmd.rs create mode 100644 src/prompt/readline/mode.rs create mode 100644 src/prompt/readline/register.rs create mode 100644 src/prompt/readline/vicmd.rs delete mode 100644 src/prompt/readline_old.rs diff --git a/Cargo.lock b/Cargo.lock index 01c5fe6..e0a0477 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -160,6 +160,7 @@ dependencies = [ "nix", "pretty_assertions", "regex", + "unicode-segmentation", "unicode-width", ] @@ -336,6 +337,12 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 409109c..5d29568 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ insta = "1.42.2" nix = { version = "0.29.0", features = ["uio", "term", "user", "hostname", "fs", "default", "signal", "process", "event", "ioctl"] } pretty_assertions = "1.4.1" regex = "1.11.1" +unicode-segmentation = "1.12.0" unicode-width = "0.2.0" [[bin]] diff --git a/src/prompt/mod.rs b/src/prompt/mod.rs index 0c6bea4..eb92a18 100644 --- a/src/prompt/mod.rs +++ b/src/prompt/mod.rs @@ -3,7 +3,7 @@ pub mod highlight; use std::path::Path; -use readline::FernReader; +use readline::FernVi; use crate::{expand::expand_prompt, libsh::error::ShResult, prelude::*, state::read_shopts}; @@ -22,6 +22,6 @@ fn get_prompt() -> ShResult { pub fn read_line() -> ShResult { let prompt = get_prompt()?; - let mut reader = FernReader::new(prompt); + let mut reader = FernVi::new(Some(prompt)); reader.readline() } diff --git a/src/prompt/readline/keys.rs b/src/prompt/readline/keys.rs index eb9d60f..6cd784a 100644 --- a/src/prompt/readline/keys.rs +++ b/src/prompt/readline/keys.rs @@ -1,63 +1,93 @@ +use std::sync::Arc; +use unicode_segmentation::UnicodeSegmentation; + // Credit to Rustyline for the design ideas in this module // https://github.com/kkawakam/rustyline #[derive(Clone,Debug)] pub struct KeyEvent(pub KeyCode, pub ModKeys); + impl KeyEvent { - pub fn new(ch: char, mut mods: ModKeys) -> Self { + pub fn new(ch: &str, mut mods: ModKeys) -> Self { use {KeyCode as K, KeyEvent as E, ModKeys as M}; - if !ch.is_control() { - if !mods.is_empty() { - mods.remove(M::SHIFT); // TODO Validate: no SHIFT even if - // `c` is uppercase - } - return E(K::Char(ch), mods); + let mut graphemes = ch.graphemes(true); + + let first = match graphemes.next() { + Some(g) => g, + None => return E(K::Null, mods), + }; + + // If more than one grapheme, it's not a single key event + if graphemes.next().is_some() { + return E(K::Null, mods); // Or panic, or wrap in Grapheme if desired } - match ch { - '\x00' => E(K::Char('@'), mods | M::CTRL), // '\0' - '\x01' => E(K::Char('A'), mods | M::CTRL), - '\x02' => E(K::Char('B'), mods | M::CTRL), - '\x03' => E(K::Char('C'), mods | M::CTRL), - '\x04' => E(K::Char('D'), mods | M::CTRL), - '\x05' => E(K::Char('E'), mods | M::CTRL), - '\x06' => E(K::Char('F'), mods | M::CTRL), - '\x07' => E(K::Char('G'), mods | M::CTRL), // '\a' - '\x08' => E(K::Backspace, mods), // '\b' - '\x09' => { - // '\t' - if mods.contains(M::SHIFT) { - mods.remove(M::SHIFT); - E(K::BackTab, mods) - } else { - E(K::Tab, mods) + + let mut chars = first.chars(); + + let single_char = chars.next(); + let is_single_char = chars.next().is_none(); + + match single_char { + Some(c) if is_single_char && c.is_control() => { + match c { + '\x00' => E(K::Char('@'), mods | M::CTRL), + '\x01' => E(K::Char('A'), mods | M::CTRL), + '\x02' => E(K::Char('B'), mods | M::CTRL), + '\x03' => E(K::Char('C'), mods | M::CTRL), + '\x04' => E(K::Char('D'), mods | M::CTRL), + '\x05' => E(K::Char('E'), mods | M::CTRL), + '\x06' => E(K::Char('F'), mods | M::CTRL), + '\x07' => E(K::Char('G'), mods | M::CTRL), + '\x08' => E(K::Backspace, mods), + '\x09' => { + if mods.contains(M::SHIFT) { + mods.remove(M::SHIFT); + E(K::BackTab, mods) + } else { + E(K::Tab, mods) + } + } + '\x0a' => E(K::Char('J'), mods | M::CTRL), + '\x0b' => E(K::Char('K'), mods | M::CTRL), + '\x0c' => E(K::Char('L'), mods | M::CTRL), + '\x0d' => E(K::Enter, mods), + '\x0e' => E(K::Char('N'), mods | M::CTRL), + '\x0f' => E(K::Char('O'), mods | M::CTRL), + '\x10' => E(K::Char('P'), mods | M::CTRL), + '\x11' => E(K::Char('Q'), mods | M::CTRL), + '\x12' => E(K::Char('R'), mods | M::CTRL), + '\x13' => E(K::Char('S'), mods | M::CTRL), + '\x14' => E(K::Char('T'), mods | M::CTRL), + '\x15' => E(K::Char('U'), mods | M::CTRL), + '\x16' => E(K::Char('V'), mods | M::CTRL), + '\x17' => E(K::Char('W'), mods | M::CTRL), + '\x18' => E(K::Char('X'), mods | M::CTRL), + '\x19' => E(K::Char('Y'), mods | M::CTRL), + '\x1a' => E(K::Char('Z'), mods | M::CTRL), + '\x1b' => E(K::Esc, mods), + '\x1c' => E(K::Char('\\'), mods | M::CTRL), + '\x1d' => E(K::Char(']'), mods | M::CTRL), + '\x1e' => E(K::Char('^'), mods | M::CTRL), + '\x1f' => E(K::Char('_'), mods | M::CTRL), + '\x7f' => E(K::Backspace, mods), + '\u{9b}' => E(K::Esc, mods | M::SHIFT), + _ => E(K::Null, mods), } } - '\x0a' => E(K::Char('J'), mods | M::CTRL), // '\n' (10) - '\x0b' => E(K::Char('K'), mods | M::CTRL), - '\x0c' => E(K::Char('L'), mods | M::CTRL), - '\x0d' => E(K::Enter, mods), // '\r' (13) - '\x0e' => E(K::Char('N'), mods | M::CTRL), - '\x0f' => E(K::Char('O'), mods | M::CTRL), - '\x10' => E(K::Char('P'), mods | M::CTRL), - '\x11' => E(K::Char('Q'), mods | M::CTRL), - '\x12' => E(K::Char('R'), mods | M::CTRL), - '\x13' => E(K::Char('S'), mods | M::CTRL), - '\x14' => E(K::Char('T'), mods | M::CTRL), - '\x15' => E(K::Char('U'), mods | M::CTRL), - '\x16' => E(K::Char('V'), mods | M::CTRL), - '\x17' => E(K::Char('W'), mods | M::CTRL), - '\x18' => E(K::Char('X'), mods | M::CTRL), - '\x19' => E(K::Char('Y'), mods | M::CTRL), - '\x1a' => E(K::Char('Z'), mods | M::CTRL), - '\x1b' => E(K::Esc, mods), // Ctrl-[, '\e' - '\x1c' => E(K::Char('\\'), mods | M::CTRL), - '\x1d' => E(K::Char(']'), mods | M::CTRL), - '\x1e' => E(K::Char('^'), mods | M::CTRL), - '\x1f' => E(K::Char('_'), mods | M::CTRL), - '\x7f' => E(K::Backspace, mods), // Rubout, Ctrl-? - '\u{9b}' => E(K::Esc, mods | M::SHIFT), - _ => E(K::Null, mods), + Some(c) if is_single_char => { + if !mods.is_empty() { + mods.remove(M::SHIFT); + } + E(K::Char(c), mods) + } + _ => { + // multi-char grapheme (emoji, accented, etc) + if !mods.is_empty() { + mods.remove(M::SHIFT); + } + E(K::Grapheme(Arc::from(first)), mods) + } } } } @@ -70,6 +100,7 @@ pub enum KeyCode { BracketedPasteStart, BracketedPasteEnd, Char(char), + Grapheme(Arc), Delete, Down, End, diff --git a/src/prompt/readline/line.rs b/src/prompt/readline/line.rs deleted file mode 100644 index e3566e9..0000000 --- a/src/prompt/readline/line.rs +++ /dev/null @@ -1,678 +0,0 @@ -use std::ops::Range; - -use crate::{libsh::{error::ShResult, term::{Style, Styled}}, prompt::readline::linecmd::Anchor}; - -use super::linecmd::{At, CharSearch, MoveCmd, Movement, Repeat, Verb, VerbCmd, Word}; - - -#[derive(Default,Debug)] -pub struct LineBuf { - pub buffer: Vec, - pub inserting: bool, - pub last_insert: String, - cursor: usize -} - -impl LineBuf { - pub fn new() -> Self { - Self::default() - } - pub fn with_initial(mut self, init: S) -> Self { - self.buffer = init.to_string().chars().collect(); - self - } - pub fn begin_insert(&mut self) { - self.inserting = true; - } - pub fn finish_insert(&mut self) { - self.inserting = false; - } - pub fn take_ins_text(&mut self) -> String { - std::mem::take(&mut self.last_insert) - } - pub fn display_lines(&self) -> Vec { - let line_bullet = "∙ ".styled(Style::Dim); - self.split_lines() - .into_iter() - .enumerate() - .map(|(i, line)| { - if i == 0 { - line.to_string() - } else { - format!("{line_bullet}{line}") - } - }) - .collect() - } - pub fn repos_cursor(&mut self) { - if self.cursor >= self.len() { - self.cursor = self.len_minus_one(); - } - } - pub fn split_lines(&self) -> Vec { - let line = self.prepare_line(); - let mut lines = vec![]; - let mut cur_line = String::new(); - for ch in line.chars() { - match ch { - '\n' => lines.push(std::mem::take(&mut cur_line)), - _ => cur_line.push(ch) - } - } - lines.push(cur_line); - lines - } - pub fn count_lines(&self) -> usize { - self.buffer.iter().filter(|&&c| c == '\n').count() - } - pub fn cursor(&self) -> usize { - self.cursor - } - pub fn prepare_line(&self) -> String { - self.buffer - .iter() - .filter(|&&c| c != '\r') - .collect::() - } - pub fn clear(&mut self) { - self.buffer.clear(); - self.cursor = 0; - } - pub fn cursor_display_coords(&self) -> (usize, usize) { - let mut x = 0; - let mut y = 0; - for i in 0..self.cursor() { - let ch = self.get_char(i); - match ch { - '\n' => { - y += 1; - x = 0; - } - '\r' => continue, - _ => { - x += 1; - } - } - } - - (x, y) - } - pub fn cursor_real_coords(&self) -> (usize,usize) { - let mut x = 0; - let mut y = 0; - for i in 0..self.cursor() { - let ch = self.get_char(i); - match ch { - '\n' => { - y += 1; - x = 0; - } - _ => { - x += 1; - } - } - } - - (x, y) - } - pub fn backspace(&mut self) { - if self.cursor() == 0 { - return - } - self.delete_pos(self.cursor() - 1); - } - pub fn delete(&mut self) { - if self.cursor() >= self.buffer.len() { - return - } - self.delete_pos(self.cursor()); - } - pub fn delete_pos(&mut self, pos: usize) { - self.buffer.remove(pos); - if pos < self.cursor() { - self.cursor = self.cursor.saturating_sub(1) - } - } - pub fn insert_at_pos(&mut self, pos: usize, ch: char) { - self.buffer.insert(pos, ch) - } - pub fn insert_at_cursor(&mut self, ch: char) { - self.buffer.insert(self.cursor, ch); - self.move_cursor_right(); - } - pub fn insert_after_cursor(&mut self, ch: char) { - self.buffer.insert(self.cursor, ch); - } - pub fn backspace_at_cursor(&mut self) { - assert!(self.cursor <= self.buffer.len()); - if self.buffer.is_empty() { - return - } - self.buffer.remove(self.cursor.saturating_sub(1)); - self.move_cursor_left(); - } - pub fn del_at_cursor(&mut self) { - assert!(self.cursor <= self.buffer.len()); - if self.buffer.is_empty() || self.cursor == self.buffer.len() { - return - } - self.buffer.remove(self.cursor); - } - pub fn move_cursor_left(&mut self) { - self.cursor = self.cursor.saturating_sub(1); - } - pub fn move_cursor_start(&mut self) { - self.cursor = 0; - } - pub fn move_cursor_end(&mut self) { - self.cursor = self.buffer.len(); - } - pub fn move_cursor_right(&mut self) { - if self.cursor == self.buffer.len() { - return - } - self.cursor = self.cursor.saturating_add(1); - } - pub fn del_from_cursor(&mut self) { - self.buffer.truncate(self.cursor); - } - pub fn del_word_back(&mut self) { - if self.cursor == 0 { - return - } - let end = self.cursor; - let mut start = self.cursor; - - while start > 0 && self.buffer[start - 1].is_whitespace() { - start -= 1; - } - - while start > 0 && !self.buffer[start - 1].is_whitespace() { - start -= 1; - } - - self.buffer.drain(start..end); - self.cursor = start; - } - pub fn len(&self) -> usize { - self.buffer.len() - } - pub fn len_minus_one(&self) -> usize { - self.buffer.len().saturating_sub(1) - } - pub fn is_empty(&self) -> bool { - self.buffer.is_empty() - } - pub fn cursor_char(&self) -> Option<&char> { - self.buffer.get(self.cursor()) - } - pub fn get_char(&self, pos: usize) -> char { - assert!((0..self.len()).contains(&pos)); - - self.buffer[pos] - } - pub fn prev_char(&self) -> Option { - if self.cursor() == 0 { - None - } else { - Some(self.get_char(self.cursor() - 1)) - } - } - pub fn next_char(&self) -> Option { - if self.cursor() == self.len_minus_one() { - None - } else { - Some(self.get_char(self.cursor() + 1)) - } - } - pub fn on_word_bound_left(&self) -> bool { - if self.cursor() == 0 { - return false - } - let Some(ch) = self.cursor_char() else { - return false - }; - let cur_char_class = CharClass::from(*ch); - let prev_char_pos = self.cursor().saturating_sub(1).max(0); - cur_char_class.is_opposite(self.get_char(prev_char_pos)) - } - pub fn on_word_bound_right(&self) -> bool { - if self.cursor() >= self.len_minus_one() { - return false - } - let Some(ch) = self.cursor_char() else { - return false - }; - let cur_char_class = CharClass::from(*ch); - let next_char_pos = self.cursor().saturating_add(1).min(self.len()); - cur_char_class.is_opposite(self.get_char(next_char_pos)) - } - fn backward_until bool>(&self, mut start: usize, cond: F) -> usize { - while start > 0 && !cond(start) { - start -= 1; - } - start - } - fn forward_until bool>(&self, mut start: usize, cond: F) -> usize { - while start < self.len() && !cond(start) { - start += 1; - } - start - } - pub fn calc_range(&mut self, movement: &Movement) -> Range { - let mut start = self.cursor(); - let mut end = self.cursor(); - - match movement { - Movement::WholeLine => { - start = self.backward_until(start, |pos| self.buffer[pos] == '\n'); - if self.buffer.get(start) == Some(&'\n') { - start += 1; // Exclude the previous newline - } - end = self.forward_until(end, |pos| self.buffer[pos] == '\n'); - } - Movement::BeginningOfLine => { - start = self.backward_until(start, |pos| self.buffer[pos] == '\n'); - } - Movement::BeginningOfFirstWord => { - let start_of_line = self.backward_until(start, |pos| self.buffer[pos] == '\n'); - start = self.forward_until(start_of_line, |pos| !self.buffer[pos].is_whitespace()); - } - Movement::EndOfLine => { - end = self.forward_until(end, |pos| self.buffer[pos] == '\n'); - } - Movement::BackwardWord(word) => { - match word { - Word::Big => { - if self.cursor_char().is_none() { - self.cursor = self.cursor.saturating_sub(1); - start = start.saturating_sub(1) - } - // Skip whitespace - let Some(cur_char) = self.cursor_char() else { - return start..end - }; - if cur_char.is_whitespace() { - start = self.backward_until(start, |pos| !self.buffer[pos].is_whitespace()) - } - - let ch_class = CharClass::from(self.get_char(start)); - let should_step = self.prev_char().is_some_and(|ch| ch_class.is_opposite(ch)); - // If we are on a word boundary, move forward one character - // If we are now on whitespace, skip it - if should_step { - start = start.saturating_sub(1).max(0); - if self.get_char(start).is_whitespace() { - start = self.backward_until(start, |pos| !self.buffer[pos].is_whitespace()) - } - } - start = self.backward_until(start, |pos| self.buffer[pos].is_whitespace()); - if self.get_char(start).is_whitespace() { - start += 1; - } - } - Word::Normal => { - if self.cursor_char().is_none() { - self.cursor = self.cursor.saturating_sub(1); - start = start.saturating_sub(1) - } - let Some(cur_char) = self.cursor_char() else { - return start..end - }; - // Skip whitespace - if cur_char.is_whitespace() { - start = self.backward_until(start, |pos| !self.get_char(pos).is_whitespace()) - } - - let ch_class = CharClass::from(self.get_char(start)); - let should_step = self.prev_char().is_some_and(|ch| ch_class.is_opposite(ch)); - // If we are on a word boundary, move forward one character - // If we are now on whitespace, skip it - if should_step { - start = start.saturating_sub(1).max(0); - if self.get_char(start).is_whitespace() { - start = self.backward_until(start, |pos| !self.get_char(pos).is_whitespace()) - } - } - - // Find an alternate charclass to stop at - let cur_char = self.get_char(start); - let cur_char_class = CharClass::from(cur_char); - start = self.backward_until(start, |pos| cur_char_class.is_opposite(self.get_char(pos))); - if cur_char_class.is_opposite(self.get_char(start)) { - start += 1; - } - } - } - } - Movement::ForwardWord(at, word) => { - let Some(cur_char) = self.cursor_char() else { - return start..end - }; - let is_ws = |pos: usize| self.buffer[pos].is_whitespace(); - let not_ws = |pos: usize| !self.buffer[pos].is_whitespace(); - - match word { - Word::Big => { - if cur_char.is_whitespace() { - end = self.forward_until(end, not_ws); - } - - let ch_class = CharClass::from(self.buffer[end]); - let should_step = self.next_char().is_some_and(|ch| ch_class.is_opposite(ch)); - - if should_step { - end = end.saturating_add(1).min(self.len_minus_one()); - if self.get_char(end).is_whitespace() { - end = self.forward_until(end, |pos| !self.get_char(pos).is_whitespace()) - } - } - - match at { - At::Start => { - if !should_step { - end = self.forward_until(end, is_ws); - end = self.forward_until(end, not_ws); - } - } - At::AfterEnd => { - end = self.forward_until(end, is_ws); - } - At::BeforeEnd => { - end = self.forward_until(end, is_ws); - if self.buffer.get(end).is_some_and(|ch| ch.is_whitespace()) { - end = end.saturating_sub(1); - } - } - } - } - Word::Normal => { - if cur_char.is_whitespace() { - end = self.forward_until(end, not_ws); - } - - let ch_class = CharClass::from(self.buffer[end]); - let should_step = self.next_char().is_some_and(|ch| ch_class.is_opposite(ch)); - - if should_step { - end = end.saturating_add(1).min(self.len_minus_one()); - if self.get_char(end).is_whitespace() { - end = self.forward_until(end, |pos| !self.get_char(pos).is_whitespace()) - } - } - - match at { - At::Start => { - if !should_step { - end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])); - if self.get_char(end).is_whitespace() { - end = self.forward_until(end, |pos| !self.get_char(pos).is_whitespace()) - } - } - } - At::AfterEnd => { - end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])); - } - At::BeforeEnd => { - end = self.forward_until(end, |pos| ch_class.is_opposite(self.buffer[pos])); - if self.buffer.get(end).is_some_and(|ch| ch.is_whitespace()) { - end = end.saturating_sub(1); - } - } - } - } - } - } - Movement::BackwardChar => { - start = start.saturating_sub(1); - } - Movement::ForwardChar => { - end = end.saturating_add(1); - } - Movement::TextObj(text_obj, bound) => todo!(), - Movement::CharSearch(char_search) => { - match char_search { - CharSearch::FindFwd(ch) => { - let ch = ch.unwrap(); - end = end.saturating_add(1).min(self.len_minus_one()); - let search = self.forward_until(end, |pos| self.buffer[pos] == ch); - - // we check anyway because it may have reached the end without finding anything - if self.buffer.get(search).is_some_and(|&s_ch| s_ch == ch) { - end = search; - } - } - CharSearch::FwdTo(ch) => { - let ch = ch.unwrap(); - end = end.saturating_add(1).min(self.len_minus_one()); - let search = self.forward_until(end, |pos| self.buffer[pos] == ch); - - // we check anyway because it may have reached the end without finding anything - if self.buffer.get(search).is_some_and(|&s_ch| s_ch == ch) { - end = search.saturating_sub(1); - } - } - CharSearch::FindBkwd(ch) => { - let ch = ch.unwrap(); - start = start.saturating_sub(1); - let search = self.backward_until(start, |pos| self.buffer[pos] == ch); - - // we check anyway because it may have reached the end without finding anything - if self.buffer.get(search).is_some_and(|&s_ch| s_ch == ch) { - start = search; - } - } - CharSearch::BkwdTo(ch) => { - let ch = ch.unwrap(); - start = start.saturating_sub(1); - let search = self.backward_until(start, |pos| self.buffer[pos] == ch); - - // we check anyway because it may have reached the end without finding anything - if self.buffer.get(search).is_some_and(|&s_ch| s_ch == ch) { - start = search.saturating_add(1); - } - } - } - } - Movement::LineUp => todo!(), - Movement::LineDown => todo!(), - Movement::WholeBuffer => { - start = 0; - end = self.len_minus_one(); - } - Movement::BeginningOfBuffer => { - start = 0; - } - Movement::EndOfBuffer => { - end = self.len_minus_one(); - } - Movement::Null => {/* nothing */} - } - - end = end.min(self.len()); - - start..end - } - pub fn exec_vi_cmd(&mut self, verb: Option, move_cmd: Option) -> ShResult<()> { - match (verb, move_cmd) { - (Some(v), None) => self.exec_vi_verb(v), - (None, Some(m)) => self.exec_vi_movement(m), - (Some(v), Some(m)) => self.exec_vi_moveverb(v,m), - (None, None) => unreachable!() - } - } - pub fn exec_vi_verb(&mut self, verb: Verb) -> ShResult<()> { - assert!(!verb.needs_movement()); - match verb { - Verb::DeleteOne(anchor) => { - match anchor { - Anchor::After => { - self.delete(); - } - Anchor::Before => { - self.backspace(); - } - } - } - Verb::Breakline(anchor) => { - match anchor { - Anchor::Before => { - let last_newline = self.backward_until(self.cursor(), |pos| self.get_char(pos) == '\n'); - self.cursor = last_newline; - self.insert_at_cursor('\n'); - self.insert_at_cursor('\r'); - } - Anchor::After => { - let next_newline = self.forward_until(self.cursor(), |pos| self.get_char(pos) == '\n'); - self.cursor = next_newline; - self.insert_at_cursor('\n'); - self.insert_at_cursor('\r'); - } - } - } - Verb::InsertChar(ch) => { - if self.inserting { - self.last_insert.push(ch); - } - self.insert_at_cursor(ch) - } - Verb::Insert(text) => { - for ch in text.chars() { - if self.inserting { - self.last_insert.push(ch); - } - self.insert_at_cursor(ch); - } - } - Verb::InsertMode => todo!(), - Verb::JoinLines => todo!(), - Verb::ToggleCase => todo!(), - Verb::OverwriteMode => todo!(), - Verb::Substitute => todo!(), - Verb::Put(_) => todo!(), - Verb::Undo => todo!(), - Verb::RepeatLast => todo!(), - Verb::Dedent => { - let mut start_pos = self.backward_until(self.cursor(), |pos| self.get_char(pos) == '\n'); - if self.get_char(start_pos) == '\n' { - start_pos += 1; - } - if self.get_char(start_pos) == '\t' { - self.delete_pos(start_pos); - } - } - Verb::Indent => { - let mut line_start = self.backward_until(self.cursor(), |pos| self.get_char(pos) == '\n'); - if self.get_char(line_start) == '\n' { - line_start += 1; - } - self.insert_at_pos(line_start, '\t'); - } - Verb::ReplaceChar(_) => todo!(), - _ => unreachable!() - } - Ok(()) - } - pub fn exec_vi_movement(&mut self, move_cmd: MoveCmd) -> ShResult<()> { - let MoveCmd { move_count, movement } = move_cmd; - for _ in 0..move_count { - let range = self.calc_range(&movement); - if range.start != self.cursor() { - self.cursor = range.start.max(0); - } else { - self.cursor = range.end.min(self.len()); - } - } - Ok(()) - } - pub fn exec_vi_moveverb(&mut self, verb: Verb, move_cmd: MoveCmd) -> ShResult<()> { - let MoveCmd { move_count, movement } = move_cmd; - match verb { - Verb::Delete => { - (0..move_count).for_each(|_| { - let range = self.calc_range(&movement); - let range = range.start..(range.end + 1).min(self.len()); - self.buffer.drain(range); - self.repos_cursor(); - }); - } - Verb::Change => { - (0..move_count).for_each(|_| { - let range = self.calc_range(&movement); - let range = range.start..(range.end + 1).min(self.len()); - self.buffer.drain(range); - self.repos_cursor(); - }); - } - Verb::Repeat(rep) => { - - } - Verb::DeleteOne(anchor) => todo!(), - Verb::Breakline(anchor) => todo!(), - Verb::Yank => todo!(), - Verb::ReplaceChar(_) => todo!(), - Verb::Substitute => todo!(), - Verb::ToggleCase => todo!(), - Verb::Undo => todo!(), - Verb::RepeatLast => todo!(), - Verb::Put(anchor) => todo!(), - Verb::OverwriteMode => todo!(), - Verb::InsertMode => todo!(), - Verb::JoinLines => todo!(), - Verb::InsertChar(_) => todo!(), - Verb::Indent => todo!(), - Verb::Dedent => todo!(), - } - Ok(()) - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub enum CharClass { - AlphaNum, - Symbol, -} - -impl CharClass { - pub fn is_opposite(&self, other: char) -> bool { - let other_class = CharClass::from(other); - other_class != *self - } -} - -impl From for CharClass { - fn from(value: char) -> Self { - if value.is_alphanumeric() || value == '_' { - CharClass::AlphaNum - } else { - CharClass::Symbol - } - } -} - - -pub fn strip_ansi_codes_and_escapes(s: &str) -> String { - let mut out = String::with_capacity(s.len()); - let mut chars = s.chars().peekable(); - - while let Some(c) = chars.next() { - if c == '\x1b' && chars.peek() == Some(&'[') { - // Skip over the escape sequence - chars.next(); // consume '[' - while let Some(&ch) = chars.peek() { - if ch.is_ascii_lowercase() || ch.is_ascii_uppercase() { - chars.next(); // consume final letter - break; - } - chars.next(); // consume intermediate characters - } - } else { - match c { - '\n' | - '\r' => { /* Continue */ } - _ => out.push(c) - } - } - } - out -} diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs new file mode 100644 index 0000000..81d6906 --- /dev/null +++ b/src/prompt/readline/linebuf.rs @@ -0,0 +1,798 @@ +use std::{fmt::Display, ops::{Deref, DerefMut, Range}, sync::Arc}; + +use unicode_width::UnicodeWidthStr; + +use crate::libsh::{error::ShResult, sys::sh_quit, term::{Style, Styled}}; + +use super::vicmd::{Anchor, Bound, Dest, Direction, Motion, RegisterName, TextObj, To, Verb, ViCmd, Word}; + +#[derive(Debug, PartialEq, Eq)] +pub enum CharClass { + Alphanum, + Symbol +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum MotionKind { + Forward(usize), + To(usize), + Backward(usize), + Range(usize,usize), + Null +} + +#[derive(Clone,Default,Debug)] +pub struct TermCharBuf(pub Vec); + +impl Deref for TermCharBuf { + type Target = Vec; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for TermCharBuf { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Display for TermCharBuf { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for ch in &self.0 { + match ch { + TermChar::Grapheme(str) => write!(f, "{str}")?, + TermChar::Newline => write!(f, "\r\n")?, + } + } + Ok(()) + } +} + +impl FromIterator for TermCharBuf { + fn from_iter>(iter: T) -> Self { + let mut buf = vec![]; + for item in iter { + buf.push(item) + } + Self(buf) + } +} + +impl From for String { + fn from(value: TermCharBuf) -> Self { + let mut string = String::new(); + for char in value.0 { + match char { + TermChar::Grapheme(str) => string.push_str(&str), + TermChar::Newline => { + string.push('\r'); + string.push('\n'); + } + } + } + string + } +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +pub enum TermChar { + Grapheme(Arc), + // Treated as '\n' in the code, printed as '\r\n' to the terminal + Newline +} + +impl TermChar { + pub fn is_whitespace(&self) -> bool { + match self { + TermChar::Newline => true, + TermChar::Grapheme(ch) => { + ch.chars().next().is_some_and(|c| c.is_whitespace()) + } + } + } + pub fn matches(&self, other: &str) -> bool { + match self { + TermChar::Grapheme(ch) => { + ch.as_ref() == other + } + TermChar::Newline => other == "\n" + } + } +} + +impl From> for TermChar { + fn from(value: Arc) -> Self { + Self::Grapheme(value) + } +} + +impl From for TermChar { + fn from(value: char) -> Self { + match value { + '\n' => Self::Newline, + ch => Self::Grapheme(Arc::from(ch.to_string())) + } + } +} + +impl Display for TermChar { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + TermChar::Grapheme(str) => { + write!(f,"{str}") + } + TermChar::Newline => { + write!(f,"\r\n") + } + } + } +} + +impl From<&TermChar> for CharClass { + fn from(value: &TermChar) -> Self { + match value { + TermChar::Newline => Self::Symbol, + TermChar::Grapheme(ch) => { + if ch.chars().next().is_some_and(|c| c.is_alphanumeric()) { + Self::Alphanum + } else { + Self::Symbol + } + } + } + } +} + +impl From for CharClass { + fn from(value: char) -> Self { + if value.is_alphanumeric() { + Self::Alphanum + } else { + Self::Symbol + } + } +} + +fn is_other_class_or_ws(a: &TermChar, b: &TermChar) -> bool { + if a.is_whitespace() || b.is_whitespace() { + return true; + } + + CharClass::from(a) != CharClass::from(b) +} + +#[derive(Default,Debug)] +pub struct LineBuf { + buffer: TermCharBuf, + cursor: usize, +} + +impl LineBuf { + pub fn new() -> Self { + Self::default() + } + pub fn with_initial(mut self, initial: &str) -> Self { + let chars = initial.chars(); + for char in chars { + self.buffer.push(char.into()) + } + self + } + pub fn buffer(&self) -> &TermCharBuf { + &self.buffer + } + pub fn cursor(&self) -> usize { + self.cursor + } + pub fn cursor_char(&self) -> Option<&TermChar> { + let tc = self.buffer.get(self.cursor())?; + Some(tc) + } + pub fn get_char(&self, pos: usize) -> Option<&TermChar> { + let tc = self.buffer.get(pos)?; + Some(tc) + } + pub fn insert_at_cursor(&mut self, tc: TermChar) { + let cursor = self.cursor(); + self.buffer.insert(cursor,tc) + } + pub fn count_lines(&self) -> usize { + self.buffer.iter().filter(|&c| c == &TermChar::Newline).count() + } + pub fn cursor_back(&mut self, count: usize) { + self.cursor = self.cursor.saturating_sub(count) + } + pub fn cursor_fwd(&mut self, count: usize) { + self.cursor = self.num_or_len(self.cursor + count) + } + pub fn cursor_to(&mut self, pos: usize) { + self.cursor = self.num_or_len(pos) + } + pub fn prepare_line(&self) -> String { + self.buffer.to_string() + } + pub fn clamp_cursor(&mut self) { + if self.cursor_char().is_none() && !self.buffer.is_empty() { + self.cursor = self.cursor.saturating_sub(1) + } + } + pub fn cursor_display_coords(&self) -> (usize, usize) { + let mut x = 0; + let mut y = 0; + for i in 0..self.cursor() { + let ch = self.get_char(i).unwrap(); + match ch { + TermChar::Grapheme(str) => x += str.width().max(1), + TermChar::Newline => { + y += 1; + x = 0; + } + } + } + + (x, y) + } + pub fn split_lines(&self) -> Vec { + let line = self.prepare_line(); + let mut lines = vec![]; + let mut cur_line = String::new(); + for ch in line.chars() { + match ch { + '\n' => lines.push(std::mem::take(&mut cur_line)), + _ => cur_line.push(ch) + } + } + lines.push(cur_line); + lines + } + pub fn display_lines(&self) -> Vec { + let line_bullet = "∙ ".styled(Style::Dim); + self.split_lines() + .into_iter() + .enumerate() + .map(|(i, line)| { + if i == 0 { + line.to_string() + } else { + format!("{line_bullet}{line}") + } + }) + .collect() + } + pub fn on_word_bound(&self, word: Word, pos: usize, dir: Direction) -> bool { + let check_pos = match dir { + Direction::Forward => self.num_or_len(pos + 1), + Direction::Backward => pos.saturating_sub(1) + }; + let Some(curr_char) = self.cursor_char() else { + return false + }; + self.get_char(check_pos).is_some_and(|c| { + match word { + Word::Big => c.is_whitespace(), + Word::Normal => is_other_class_or_ws(curr_char, c) + } + }) + } + fn backward_until bool>(&self, mut start: usize, cond: F, inclusive: bool) -> usize { + while start > 0 && !cond(&self.buffer[start]) { + start -= 1; + } + if !inclusive { + if start > 0 { + start.saturating_add(1) + } else { + start + } + } else { + start + } + } + fn forward_until bool>(&self, mut start: usize, cond: F, inclusive: bool) -> usize { + while start < self.buffer.len() && !cond(&self.buffer[start]) { + start += 1; + } + if !inclusive { + if start < self.buffer.len() { + start.saturating_sub(1) + } else { + start + } + } else { + start + } + } + pub fn find_word_pos(&self, word: Word, dest: To, dir: Direction) -> usize { + let mut pos = self.cursor(); + match dir { + Direction::Forward => { + match word { + Word::Big => { + match dest { + To::Start => { + if self.on_word_bound(word, pos, dir) { + // Push the cursor off of the word + pos = self.num_or_len(pos + 1); + } + // Pass the current word if any + if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { + pos = self.forward_until(pos, |c| c.is_whitespace(), true); + } + // Land on the start of the next word + pos = self.forward_until(pos, |c| !c.is_whitespace(), true) + } + To::End => { + if self.on_word_bound(word, pos, dir) { + // Push the cursor off of the word + pos = self.num_or_len(pos + 1); + } + if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { + // We are in a word + // Go to the end of the current word + pos = self.forward_until(pos, |c| c.is_whitespace(), false) + } else { + // We are outside of a word + // Find the next word, then go to the end of it + pos = self.forward_until(pos, |c| !c.is_whitespace(), true); + pos = self.forward_until(pos, |c| c.is_whitespace(), false) + } + } + } + } + Word::Normal => { + match dest { + To::Start => { + if self.on_word_bound(word, pos, dir) { + // Push the cursor off of the word + pos = self.num_or_len(pos + 1); + } + if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { + // We are inside of a word + // Find the next instance of whitespace or a different char class + let this_char = self.get_char(pos).unwrap(); + pos = self.forward_until(pos, |c| is_other_class_or_ws(this_char, c), true); + + // If we found whitespace, continue until we find non-whitespace + if self.get_char(pos).is_some_and(|c| c.is_whitespace()) { + pos = self.forward_until(pos, |c| !c.is_whitespace(), true) + } + } else { + // We are in whitespace, proceed to the next word + pos = self.forward_until(pos, |c| !c.is_whitespace(), true) + } + } + To::End => { + if self.on_word_bound(word, pos, dir) { + // Push the cursor off of the word + pos = self.num_or_len(pos + 1); + } + if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { + // Proceed up until the next differing char class + let this_char = self.get_char(pos).unwrap(); + pos = self.forward_until(pos, |c| is_other_class_or_ws(this_char, c), false); + } else { + // Find the next non-whitespace character + pos = self.forward_until(pos, |c| !c.is_whitespace(), true); + // Then proceed until a differing char class is found + let this_char = self.get_char(pos).unwrap(); + pos = self.forward_until(pos, |c|is_other_class_or_ws(this_char, c), false); + } + } + } + } + } + } + Direction::Backward => { + match word { + Word::Big => { + match dest { + To::Start => { + if self.on_word_bound(word, pos, dir) { + // Push the cursor off + pos = pos.saturating_sub(1); + } + if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { + // We are in a word, go to the start of it + pos = self.backward_until(pos, |c| c.is_whitespace(), false); + } else { + // We are not in a word, find one and go to the start of it + pos = self.backward_until(pos, |c| !c.is_whitespace(), true); + pos = self.backward_until(pos, |c| c.is_whitespace(), false); + } + } + To::End => unreachable!() + } + } + Word::Normal => { + match dest { + To::Start => { + if self.on_word_bound(word, pos, dir) { + pos = pos.saturating_sub(1); + } + if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { + let this_char = self.get_char(pos).unwrap(); + pos = self.backward_until(pos, |c| is_other_class_or_ws(this_char, c), false) + } else { + pos = self.backward_until(pos, |c| !c.is_whitespace(), true); + let this_char = self.get_char(pos).unwrap(); + pos = self.backward_until(pos, |c| is_other_class_or_ws(this_char, c), false); + } + } + To::End => unreachable!() + } + } + } + } + } + pos + } + pub fn eval_text_obj(&self, obj: TextObj, bound: Bound) -> Range { + let mut start = self.cursor(); + let mut end = self.cursor(); + + match obj { + TextObj::Word(word) => { + start = match self.on_word_bound(word, self.cursor(), Direction::Backward) { + true => self.cursor(), + false => self.find_word_pos(word, To::Start, Direction::Backward), + }; + end = match self.on_word_bound(word, self.cursor(), Direction::Forward) { + true => self.cursor(), + false => self.find_word_pos(word, To::End, Direction::Forward), + }; + end = self.num_or_len(end + 1); + if bound == Bound::Around { + end = self.forward_until(end, |c| c.is_whitespace(), true); + end = self.forward_until(end, |c| !c.is_whitespace(), true); + } + return start..end + } + TextObj::Line => { + let cursor = self.cursor(); + start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); + end = self.forward_until(cursor, |c| c == &TermChar::Newline, true); + } + TextObj::Sentence => todo!(), + TextObj::Paragraph => todo!(), + TextObj::DoubleQuote => { + let cursor = self.cursor(); + let ln_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); + let mut line_chars = self.buffer[ln_start..cursor].iter(); + let mut in_quote = false; + while let Some(ch) = line_chars.next() { + let TermChar::Grapheme(ch) = ch else { unreachable!() }; + match ch.as_ref() { + "\\" => { + line_chars.next(); + } + "\"" => in_quote = !in_quote, + _ => { /* continue */ } + } + } + let mut start_pos = cursor; + let end_pos; + if !in_quote { + start_pos = self.forward_until(start_pos, |c| c.matches("\n") || c.matches("\""), true); + if !self.get_char(start_pos).is_some_and(|c| c.matches("\"")) { + return cursor..cursor + } + end_pos = self.forward_until(start_pos, |c| c.matches("\n") || c.matches("\""), true); + if !self.get_char(end_pos).is_some_and(|c| c.matches("\"")) { + return cursor..cursor + } + start = start_pos; + end = end_pos; + } else { + start_pos = self.backward_until(start_pos, |c| c.matches("\n") || c.matches("\""), true); + if !self.get_char(start_pos).is_some_and(|c| c.matches("\"")) { + return cursor..cursor + } + end_pos = self.forward_until(self.num_or_len(start_pos + 1), |c| c.matches("\n") || c.matches("\""), true); + if !self.get_char(end_pos).is_some_and(|c| c.matches("\"")) { + return cursor..cursor + } + start = start_pos; + end = self.num_or_len(end_pos + 1); + + if bound == Bound::Around && self.get_char(end).is_some_and(|c| c.is_whitespace()) { + end += 1; + end = self.forward_until(end, |c| !c.is_whitespace(), true); + } + } + } + TextObj::SingleQuote => todo!(), + TextObj::BacktickQuote => todo!(), + TextObj::Paren => todo!(), + TextObj::Bracket => todo!(), + TextObj::Brace => todo!(), + TextObj::Angle => todo!(), + TextObj::Tag => todo!(), + TextObj::Custom(_) => todo!(), + } + + if bound == Bound::Inside { + start = self.num_or_len(start + 1); + end = end.saturating_sub(1); + } + start..end + } + /// Clamp a number to the length of the buffer + pub fn num_or_len(&self, num: usize) -> usize { + num.min(self.buffer.len().saturating_sub(1)) + } + pub fn eval_motion(&self, motion: Motion) -> MotionKind { + match motion { + Motion::WholeLine => { + let cursor = self.cursor(); + let start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); + let end = self.forward_until(cursor, |c| c == &TermChar::Newline, true); + MotionKind::Range(start,end) + } + Motion::TextObj(text_obj, bound) => { + let range = self.eval_text_obj(text_obj, bound); + let range = mk_range(range.start, range.end); + MotionKind::Range(range.start,range.end) + } + Motion::BeginningOfFirstWord => { + let cursor = self.cursor(); + let line_start = self.backward_until(cursor, |c| c == &TermChar::Newline, true); + let first_print = self.forward_until(line_start, |c| !c.is_whitespace(), true); + MotionKind::To(first_print) + } + Motion::BeginningOfLine => { + let cursor = self.cursor(); + let line_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); + MotionKind::To(line_start) + } + Motion::EndOfLine => { + let cursor = self.cursor(); + let line_end = self.forward_until(cursor, |c| c == &TermChar::Newline, false); + MotionKind::To(line_end) + } + Motion::BackwardWord(word) => MotionKind::To(self.find_word_pos(word, To::Start, Direction::Backward)), + Motion::ForwardWord(dest, word) => MotionKind::To(self.find_word_pos(word, dest, Direction::Forward)), + Motion::CharSearch(direction, dest, ch) => { + let mut cursor = self.cursor(); + let inclusive = matches!(dest, Dest::On); + + let stop_condition = |c: &TermChar| { + c == &TermChar::Newline || + c == &ch + }; + if self.cursor_char().is_some_and(|c| c == &ch) { + // We are already on the character we are looking for + // Let's nudge the cursor + match direction { + Direction::Backward => cursor = self.cursor().saturating_sub(1), + Direction::Forward => cursor = self.num_or_len(self.cursor() + 1), + } + } + + let stop_pos = match direction { + Direction::Forward => self.forward_until(cursor, stop_condition, inclusive), + Direction::Backward => self.backward_until(cursor, stop_condition, inclusive), + }; + + let found_char = match dest { + Dest::On => self.get_char(stop_pos).is_some_and(|c| c == &ch), + _ => { + match direction { + Direction::Forward => self.get_char(stop_pos + 1).is_some_and(|c| c == &ch), + Direction::Backward => self.get_char(stop_pos.saturating_sub(1)).is_some_and(|c| c == &ch), + } + } + }; + + if found_char { + MotionKind::To(stop_pos) + } else { + MotionKind::Null + } + } + Motion::BackwardChar => MotionKind::Backward(1), + Motion::ForwardChar => MotionKind::Forward(1), + Motion::LineUp => todo!(), + Motion::LineDown => todo!(), + Motion::WholeBuffer => MotionKind::Range(0,self.buffer.len().saturating_sub(1)), + Motion::BeginningOfBuffer => MotionKind::To(0), + Motion::EndOfBuffer => MotionKind::To(self.buffer.len().saturating_sub(1)), + Motion::Null => MotionKind::Null, + Motion::Builder(_) => unreachable!(), + } + } + pub fn exec_verb(&mut self, verb: Verb, motion: MotionKind, register: RegisterName) -> ShResult<()> { + match verb { + Verb::Change | + Verb::Delete => { + let deleted; + match motion { + MotionKind::Forward(n) => { + let fwd = self.num_or_len(self.cursor() + n); + let cursor = self.cursor(); + deleted = self.buffer.drain(cursor..=fwd).collect::(); + } + MotionKind::To(pos) => { + let range = mk_range(self.cursor(), pos); + deleted = self.buffer.drain(range.clone()).collect::(); + self.apply_motion(MotionKind::To(range.start)); + } + MotionKind::Backward(n) => { + let back = self.cursor.saturating_sub(n); + let cursor = self.cursor(); + deleted = self.buffer.drain(back..cursor).collect::(); + self.apply_motion(MotionKind::To(back)); + } + MotionKind::Range(s, e) => { + deleted = self.buffer.drain(s..e).collect::(); + self.apply_motion(MotionKind::To(s)); + } + MotionKind::Null => return Ok(()) + } + register.write_to_register(deleted); + } + Verb::DeleteChar(anchor) => { + match anchor { + Anchor::After => { + let pos = self.num_or_len(self.cursor() + 1); + self.buffer.remove(pos); + } + Anchor::Before => { + let pos = self.cursor.saturating_sub(1); + self.buffer.remove(pos); + self.cursor = self.cursor.saturating_sub(1); + } + } + } + Verb::Yank => { + let yanked; + match motion { + MotionKind::Forward(n) => { + let fwd = self.num_or_len(self.cursor() + n); + let cursor = self.cursor(); + yanked = self.buffer[cursor..=fwd] + .iter() + .cloned() + .collect::(); + } + MotionKind::To(pos) => { + let range = mk_range(self.cursor(), pos); + yanked = self.buffer[range.clone()] + .iter() + .cloned() + .collect::(); + self.apply_motion(MotionKind::To(range.start)); + } + MotionKind::Backward(n) => { + let back = self.cursor.saturating_sub(n); + let cursor = self.cursor(); + yanked = self.buffer[back..cursor] + .iter() + .cloned() + .collect::(); + self.apply_motion(MotionKind::To(back)); + } + MotionKind::Range(s, e) => { + yanked = self.buffer[s..e] + .iter() + .cloned() + .collect::(); + self.apply_motion(MotionKind::To(s)); + } + MotionKind::Null => return Ok(()) + } + register.write_to_register(yanked); + } + Verb::ReplaceChar(_) => todo!(), + Verb::Substitute => todo!(), + Verb::ToggleCase => todo!(), + Verb::Complete => todo!(), + Verb::CompleteBackward => todo!(), + Verb::Undo => todo!(), + Verb::RepeatLast => todo!(), + Verb::Put(anchor) => { + if let Some(charbuf) = register.read_from_register() { + let chars = charbuf.0.into_iter(); + if anchor == Anchor::Before { + self.cursor_back(1); + } + for char in chars { + self.insert_at_cursor(char); + self.cursor_fwd(1); + } + } + } + Verb::JoinLines => todo!(), + Verb::InsertChar(ch) => { + self.insert_at_cursor(ch); + self.apply_motion(motion); + } + Verb::Insert(_) => todo!(), + Verb::Breakline(anchor) => todo!(), + Verb::Indent => todo!(), + Verb::Dedent => todo!(), + Verb::AcceptLine => todo!(), + Verb::EndOfFile => { + if self.buffer.is_empty() { + sh_quit(0) + } else { + self.buffer.clear(); + self.cursor = 0; + } + } + Verb::InsertMode | + Verb::NormalMode | + Verb::VisualMode | + Verb::OverwriteMode => { + self.apply_motion(motion); + } + } + Ok(()) + } + pub fn apply_motion(&mut self, motion: MotionKind) { + match motion { + MotionKind::Forward(n) => self.cursor_fwd(n), + MotionKind::To(pos) => self.cursor_to(pos), + MotionKind::Backward(n) => self.cursor_back(n), + MotionKind::Range(s, _) => self.cursor_to(s), // TODO: not sure if this is correct in every case + MotionKind::Null => { /* Pass */ } + } + } + pub fn exec_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { + let ViCmd { register, verb_count, verb, motion_count, motion, .. } = cmd; + + for _ in 0..verb_count.unwrap_or(1) { + for _ in 0..motion_count.unwrap_or(1) { + let motion = motion + .clone() + .map(|m| self.eval_motion(m)) + .unwrap_or(MotionKind::Null); + + if let Some(verb) = verb.clone() { + self.exec_verb(verb, motion, register)?; + } else { + self.apply_motion(motion); + } + } + } + + self.clamp_cursor(); + Ok(()) + } +} + +impl Display for LineBuf { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f,"{}",self.buffer) + } +} + +pub fn strip_ansi_codes_and_escapes(s: &str) -> String { + let mut out = String::with_capacity(s.len()); + let mut chars = s.chars().peekable(); + + while let Some(c) = chars.next() { + if c == '\x1b' && chars.peek() == Some(&'[') { + // Skip over the escape sequence + chars.next(); // consume '[' + while let Some(&ch) = chars.peek() { + if ch.is_ascii_lowercase() || ch.is_ascii_uppercase() { + chars.next(); // consume final letter + break; + } + chars.next(); // consume intermediate characters + } + } else { + match c { + '\n' | + '\r' => { /* Continue */ } + _ => out.push(c) + } + } + } + out +} + +fn mk_range(a: usize, b: usize) -> Range { + std::cmp::min(a, b)..std::cmp::max(a, b) +} diff --git a/src/prompt/readline/linecmd.rs b/src/prompt/readline/linecmd.rs deleted file mode 100644 index c5c72c0..0000000 --- a/src/prompt/readline/linecmd.rs +++ /dev/null @@ -1,420 +0,0 @@ -// Credit to Rustyline for enumerating these editor commands -// https://github.com/kkawakam/rustyline - -use crate::libsh::error::{ShErr, ShErrKind, ShResult}; -use crate::prelude::*; - -pub type RepeatCount = u16; - -#[derive(Default, Debug, Clone, Eq, PartialEq)] -pub struct ViCmdBuilder { - verb_count: Option, - verb: Option, - move_count: Option, - movement: Option, -} - -impl ViCmdBuilder { - pub fn new() -> Self { - Self::default() - } - pub fn with_verb_count(self, verb_count: u16) -> Self { - let Self { verb_count: _, verb, move_count, movement } = self; - Self { verb_count: Some(verb_count), verb, move_count, movement } - } - pub fn with_verb(self, verb: Verb) -> Self { - let Self { verb_count, verb: _, move_count, movement } = self; - Self { verb_count, verb: Some(verb), move_count, movement } - } - pub fn with_move_count(self, move_count: u16) -> Self { - let Self { verb_count, verb, move_count: _, movement } = self; - Self { verb_count, verb, move_count: Some(move_count), movement } - } - pub fn with_movement(self, movement: Movement) -> Self { - let Self { verb_count, verb, move_count, movement: _ } = self; - Self { verb_count, verb, move_count, movement: Some(movement) } - } - pub fn verb_count(&self) -> Option { - self.verb_count - } - pub fn move_count(&self) -> Option { - self.move_count - } - pub fn movement(&self) -> Option<&Movement> { - self.movement.as_ref() - } - pub fn verb(&self) -> Option<&Verb> { - self.verb.as_ref() - } - pub fn append_digit(&mut self, digit: char) { - // Convert char digit to a number (assuming ASCII '0'..'9') - let digit_val = digit.to_digit(10).expect("digit must be 0-9") as u16; - - if self.verb.is_none() { - // Append to verb_count - self.verb_count = Some(match self.verb_count { - Some(count) => count * 10 + digit_val, - None => digit_val, - }); - } else { - // Append to move_count - self.move_count = Some(match self.move_count { - Some(count) => count * 10 + digit_val, - None => digit_val, - }); - } - } - pub fn is_unfinished(&self) -> bool { - (self.verb.is_none() && self.movement.is_none()) || - (self.verb.is_none() && self.movement.as_ref().is_some_and(|m| m.needs_verb())) || - (self.movement.is_none() && self.verb.as_ref().is_some_and(|v| v.needs_movement())) - } - pub fn build(self) -> ShResult { - if self.is_unfinished() { - flog!(ERROR, "Unfinished Builder: {:?}", self); - return Err( - ShErr::simple(ShErrKind::ReadlineErr, "called ViCmdBuilder::build() with an unfinished builder") - ) - } - let Self { verb_count, verb, move_count, movement } = self; - let verb_count = verb_count.unwrap_or(1); - let move_count = move_count.unwrap_or(if verb.is_none() { verb_count } else { 1 }); - let verb = verb.map(|v| VerbCmd { verb_count, verb: v }); - let movement = movement.map(|m| MoveCmd { move_count, movement: m }); - Ok(match (verb, movement) { - (Some(v), Some(m)) => ViCmd::MoveVerb(v, m), - (Some(v), None) => ViCmd::Verb(v), - (None, Some(m)) => ViCmd::Move(m), - (None, None) => unreachable!(), - }) - } -} - - -#[derive(Debug, Clone, Eq, PartialEq)] -pub enum ViCmd { - MoveVerb(VerbCmd, MoveCmd), - Verb(VerbCmd), - Move(MoveCmd) -} - -#[derive(Debug, Clone, Eq, PartialEq)] -pub struct VerbCmd { - pub verb_count: u16, - pub verb: Verb -} - -#[derive(Debug, Clone, Eq, PartialEq)] -pub struct MoveCmd { - pub move_count: u16, - pub movement: Movement -} - -#[derive(Default, Debug, Clone, Eq, PartialEq)] -pub struct Repeat { - pub movement: Option, - pub verb: Option>, - pub ins_text: Option -} - -impl Repeat { - pub fn from_cmd(cmd: ViCmd) -> Self { - match cmd { - ViCmd::MoveVerb(verb_cmd, move_cmd) => { - Self { - movement: Some(move_cmd), - verb: Some(Box::new(verb_cmd)), - ins_text: None, - } - } - ViCmd::Verb(verb_cmd) => { - Self { - movement: None, - verb: Some(Box::new(verb_cmd)), - ins_text: None, - } - } - ViCmd::Move(move_cmd) => { - Self { - movement: Some(move_cmd), - verb: None, - ins_text: None, - } - } - } - } - pub fn set_ins_text(&mut self, ins_text: String) { - self.ins_text = Some(ins_text); - } - fn is_empty(&self) -> bool { - self.movement.is_none() && self.verb.is_none() && self.ins_text.is_none() - } - pub fn to_option(self) -> Option { - if self.is_empty() { - None - } else { - Some(self) - } - } -} - -#[derive(Debug, Clone, Eq, PartialEq)] -#[non_exhaustive] -pub enum Verb { - /// `d`, `D` — delete motion or line - Delete, - /// `x`, `X` — delete one char, forward or back - DeleteOne(Anchor), - /// `c`, `C` — change (delete + insert) - Change, - /// `y`, `Y` — yank (copy) - Yank, - /// `r` — replace a single character - ReplaceChar(char), - /// `s` or `S` — substitute (change + single char or line) - Substitute, - /// `~` — swap case - ToggleCase, - /// `u` — undo - Undo, - /// `.` — repeat last edit - RepeatLast, - /// `p`, `P` — paste - Put(Anchor), - /// `R` — overwrite characters - OverwriteMode, - /// `i`, `a`, `I`, `A`, `o`, `O` — insert/append text - InsertMode, - /// `J` — join lines - JoinLines, - Repeat(Repeat), - InsertChar(char), - Insert(String), - Breakline(Anchor), - Indent, - Dedent -} - -impl Verb { - pub fn needs_movement(&self) -> bool { - match self { - Verb::DeleteOne(_) | - Verb::InsertMode | - Verb::JoinLines | - Verb::ToggleCase | - Verb::OverwriteMode | - Verb::Substitute | - Verb::Put(_) | - Verb::Undo | - Verb::RepeatLast | - Verb::Dedent | - Verb::Indent | - Verb::InsertChar(_) | - Verb::Breakline(_) | - Verb::Repeat(_) | - Verb::Insert(_) | - Verb::ReplaceChar(_) => false, - Verb::Delete | - Verb::Change | - Verb::Yank => true - } - } -} - -#[derive(Debug, Clone, Eq, PartialEq)] -pub enum Movement { - /// Whole current line (not really a movement but a range) - WholeLine, - TextObj(TextObj, Bound), - BeginningOfFirstWord, - /// beginning-of-line - BeginningOfLine, - /// end-of-line - EndOfLine, - /// backward-word, vi-prev-word - BackwardWord(Word), // Backward until start of word - /// forward-word, vi-end-word, vi-next-word - ForwardWord(At, Word), // Forward until start/end of word - /// character-search, character-search-backward, vi-char-search - CharSearch(CharSearch), - /// backward-char - BackwardChar, - /// forward-char - ForwardChar, - /// move to the same column on the previous line - LineUp, - /// move to the same column on the next line - LineDown, - /// Whole user input (not really a movement but a range) - WholeBuffer, - /// beginning-of-buffer - BeginningOfBuffer, - /// end-of-buffer - EndOfBuffer, - Null -} - -impl Movement { - pub fn needs_verb(&self) -> bool { - match self { - Self::WholeLine | - Self::BeginningOfLine | - Self::BeginningOfFirstWord | - Self::EndOfLine | - Self::BackwardWord(_) | - Self::ForwardWord(_, _) | - Self::CharSearch(_) | - Self::BackwardChar | - Self::ForwardChar | - Self::LineUp | - Self::LineDown | - Self::WholeBuffer | - Self::BeginningOfBuffer | - Self::EndOfBuffer => false, - Self::Null | - Self::TextObj(_, _) => true - } - } -} - -#[derive(Debug, Clone, Eq, PartialEq)] -pub enum TextObj { - /// `iw`, `aw` — inner word, around word - Word, - - /// `is`, `as` — inner sentence, around sentence - Sentence, - - /// `ip`, `ap` — inner paragraph, around paragraph - Paragraph, - - /// `i"`, `a"` — inner/around double quotes - DoubleQuote, - /// `i'`, `a'` - SingleQuote, - /// `i\``, `a\`` - BacktickQuote, - - /// `i)`, `a)` — round parens - Paren, - /// `i]`, `a]` - Bracket, - /// `i}`, `a}` - Brace, - /// `i<`, `a<` - Angle, - - /// `it`, `at` — HTML/XML tags (if you support it) - Tag, - - /// Custom user-defined objects maybe? - Custom(char), -} - -#[derive(Debug, Clone, Eq, PartialEq)] -pub enum Bound { - Inside, - Around -} - -#[derive(Debug, Clone, Eq, PartialEq)] -#[non_exhaustive] -pub enum LineCmd { - Abort, - AcceptLine, - BeginningOfHistory, - CapitalizeWord, - ClearScreen, - Complete, - CompleteBackward, - CompleteHint, - DowncaseWord, - EndOfFile, - EndOfHistory, - ForwardSearchHistory, - HistorySearchBackward, - HistorySearchForward, - Insert(String), - Interrupt, - Move(Movement), - NextHistory, - Noop, - Overwrite(char), - PreviousHistory, - QuotedInsert, - Repaint, - ReverseSearchHistory, - Suspend, - TransposeChars, - TransposeWords, - YankPop, - LineUpOrPreviousHistory, - LineDownOrNextHistory, - Newline, - AcceptOrInsertLine { accept_in_the_middle: bool }, - /// 🧵 New: vi-style editing command - ViCmd(ViCmd), - /// unknown/unmapped key - Unknown, - Null, -} -impl LineCmd { - pub fn backspace() -> Self { - let cmd = ViCmdBuilder::new() - .with_verb(Verb::DeleteOne(Anchor::Before)) - .build() - .unwrap(); - Self::ViCmd(cmd) - } - const fn is_repeatable_change(&self) -> bool { - matches!( - *self, - Self::Insert(..) - | Self::ViCmd(..) - ) - } - - const fn is_repeatable(&self) -> bool { - match *self { - Self::Move(_) => true, - _ => self.is_repeatable_change(), - } - } -} - -#[derive(Debug, Clone, Eq, PartialEq, Copy)] -pub enum At { - Start, - BeforeEnd, - AfterEnd -} - -#[derive(Debug, Clone, Eq, PartialEq, Copy)] -pub enum Anchor { - After, - Before -} - -#[derive(Debug, Clone, Eq, PartialEq, Copy)] -pub enum CharSearch { - FindFwd(Option), - FwdTo(Option), - FindBkwd(Option), - BkwdTo(Option), -} - -#[derive(Debug, Clone, Eq, PartialEq, Copy)] -pub enum Word { - Big, - Normal -} - - -#[derive(Default,Debug,Clone,Copy,PartialEq,Eq,PartialOrd,Ord)] -pub enum InputMode { - Normal, - #[default] - Insert, - Visual, - Replace -} diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 6d130d0..1bb8752 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -1,86 +1,49 @@ -use std::{arch::asm, os::fd::BorrowedFd}; +use std::{collections::HashMap, sync::Mutex}; -use keys::KeyEvent; -use line::{strip_ansi_codes_and_escapes, LineBuf}; -use linecmd::{Anchor, At, CharSearch, InputMode, LineCmd, MoveCmd, Movement, Verb, VerbCmd, ViCmd, ViCmdBuilder, Word}; -use nix::{libc::STDIN_FILENO, sys::termios::{self, Termios}, unistd::read}; +use linebuf::{strip_ansi_codes_and_escapes, LineBuf, TermCharBuf}; +use mode::{CmdReplay, ViInsert, ViMode, ViNormal}; use term::Terminal; use unicode_width::UnicodeWidthStr; +use vicmd::{Verb, ViCmd}; + +use crate::libsh::{error::ShResult, term::{Style, Styled}}; -use crate::{libsh::{error::{ShErr, ShErrKind, ShResult}, sys::sh_quit}, prelude::*}; -use linecmd::Repeat; -pub mod term; -pub mod line; pub mod keys; -pub mod linecmd; +pub mod term; +pub mod linebuf; +pub mod vicmd; +pub mod mode; +pub mod register; -/// Add a verb to a specified ViCmdBuilder, then build it -/// -/// Returns the built value as a LineCmd::ViCmd -macro_rules! build_verb { - ($cmd:expr,$verb:expr) => {{ - $cmd.with_verb($verb).build().map(|cmd| LineCmd::ViCmd(cmd)) - }} +pub struct FernVi { + term: Terminal, + line: LineBuf, + prompt: String, + mode: Box, + repeat_action: Option, } -/// Add a movement to a specified ViCmdBuilder, then build it -/// -/// Returns the built value as a LineCmd::ViCmd -macro_rules! build_movement { - ($cmd:expr,$move:expr) => {{ - $cmd.with_movement($move).build().map(|cmd| LineCmd::ViCmd(cmd)) - }} -} +impl FernVi { + pub fn new(prompt: Option) -> Self { + let prompt = prompt.unwrap_or("$ ".styled(Style::Green | Style::Bold)); + let line = LineBuf::new().with_initial("The quick brown fox jumps over the lazy dog");//\nThe quick brown fox jumps over the lazy dog\nThe quick brown fox jumps over the lazy dog\n"); -/// Add both a movement and a verb to a specified ViCmdBuilder, then build it -/// -/// Returns the built value as a LineCmd::ViCmd -macro_rules! build_moveverb { - ($cmd:expr,$verb:expr,$move:expr) => {{ - $cmd.with_movement($move).with_verb($verb).build().map(|cmd| LineCmd::ViCmd(cmd)) - }} -} - -#[derive(Default,Debug)] -pub struct FernReader { - pub term: Terminal, - pub prompt: String, - pub line: LineBuf, - pub edit_mode: InputMode, - pub last_vicmd: Option, -} - -impl FernReader { - pub fn new(prompt: String) -> Self { - let line = LineBuf::new().with_initial("The quick brown fox jumped over the lazy dog."); Self { term: Terminal::new(), - prompt, line, - edit_mode: Default::default(), - last_vicmd: Default::default() + prompt, + mode: Box::new(ViInsert::new()), + repeat_action: None, } } - fn pack_line(&mut self) -> String { - self.line - .buffer - .iter() - .collect::() - } - pub fn readline(&mut self) -> ShResult { - self.display_line(/*refresh: */ false); - loop { - let cmd = self.next_cmd()?; - if cmd == LineCmd::AcceptLine { - return Ok(self.pack_line()) - } - self.execute_cmd(cmd)?; - self.display_line(/* refresh: */ true); - } - } - fn clear_line(&self) { + pub fn clear_line(&self) { let prompt_lines = self.prompt.lines().count(); - let buf_lines = self.line.count_lines().saturating_sub(1); // One of the buffer's lines will overlap with the prompt. probably. + let buf_lines = if self.prompt.ends_with('\n') { + self.line.count_lines() + } else { + // The prompt does not end with a newline, so one of the buffer's lines overlaps with it + self.line.count_lines().saturating_sub(1) + }; let total = prompt_lines + buf_lines; self.term.write_bytes(b"\r\n"); for _ in 0..total { @@ -88,9 +51,9 @@ impl FernReader { } self.term.write_bytes(b"\r\x1b[2K"); } - fn display_line(&mut self, refresh: bool) { + pub fn print_buf(&self, refresh: bool) { if refresh { - self.clear_line(); + self.clear_line() } let mut prompt_lines = self.prompt.lines().peekable(); let mut last_line_len = 0; @@ -114,315 +77,54 @@ impl FernReader { } } - if num_lines == 1 { - let cursor_offset = self.line.cursor() + last_line_len; - self.term.write(&format!("\r\x1b[{}C", cursor_offset)); - } else { - let (x, y) = self.line.cursor_display_coords(); - // Y-axis movements are 1-indexed and must move up from the bottom - // Therefore, add 1 to Y and subtract that number from the number of lines - // to find the number of times we have to push the cursor upward - let y = num_lines.saturating_sub(y+1); - if y > 0 { - self.term.write(&format!("\r\x1b[{}A", y)) - } - self.term.write(&format!("\r\x1b[{}C", x+2)); // Factor in the line bullet thing - } - match self.edit_mode { - InputMode::Replace | - InputMode::Insert => { - self.term.write("\x1b[6 q") - } - InputMode::Normal | - InputMode::Visual => { - self.term.write("\x1b[2 q") - } - } - } - pub fn set_normal_mode(&mut self) { - self.edit_mode = InputMode::Normal; - self.line.finish_insert(); - let ins_text = self.line.take_ins_text(); - self.last_vicmd.as_mut().map(|cmd| cmd.set_ins_text(ins_text)); - } - pub fn set_insert_mode(&mut self) { - self.edit_mode = InputMode::Insert; - self.line.begin_insert(); - } - pub fn next_cmd(&mut self) -> ShResult { - let vi_cmd = ViCmdBuilder::new(); - match self.edit_mode { - InputMode::Normal => self.get_normal_cmd(vi_cmd), - InputMode::Insert => self.get_insert_cmd(vi_cmd), - InputMode::Visual => todo!(), - InputMode::Replace => todo!(), - } - } - pub fn get_insert_cmd(&mut self, pending_cmd: ViCmdBuilder) -> ShResult { - use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; - let key = self.term.read_key(); - let cmd = match key { - E(K::Char(ch), M::NONE) => build_verb!(pending_cmd, Verb::InsertChar(ch))?, + let (x, y) = self.line.cursor_display_coords(); + let y = num_lines.saturating_sub(y + 1); - E(K::Char('H'), M::CTRL) | - E(K::Backspace, M::NONE) => LineCmd::backspace(), - - E(K::BackTab, M::NONE) => LineCmd::CompleteBackward, - - E(K::Char('I'), M::CTRL) | - E(K::Tab, M::NONE) => LineCmd::Complete, - - E(K::Esc, M::NONE) => { - build_movement!(pending_cmd, Movement::BackwardChar)? - } - _ => { - flog!(INFO, "unhandled key in get_insert_cmd, trying common_cmd..."); - return self.common_cmd(key, pending_cmd) - } - }; - Ok(cmd) - } - - pub fn get_normal_cmd(&mut self, mut pending_cmd: ViCmdBuilder) -> ShResult { - use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; - let key = self.term.read_key(); - - if let E(K::Char(ch), M::NONE) = key { - if pending_cmd.movement().is_some_and(|m| matches!(m, Movement::CharSearch(_))) { - let Movement::CharSearch(charsearch) = pending_cmd.movement().unwrap() else {unreachable!()}; - match charsearch { - CharSearch::FindFwd(_) => { - let finalized = CharSearch::FindFwd(Some(ch)); - return build_movement!(pending_cmd, Movement::CharSearch(finalized)) - } - CharSearch::FwdTo(_) => { - let finalized = CharSearch::FwdTo(Some(ch)); - return build_movement!(pending_cmd, Movement::CharSearch(finalized)) - } - CharSearch::FindBkwd(_) => { - let finalized = CharSearch::FindBkwd(Some(ch)); - return build_movement!(pending_cmd, Movement::CharSearch(finalized)) - } - CharSearch::BkwdTo(_) => { - let finalized = CharSearch::BkwdTo(Some(ch)); - return build_movement!(pending_cmd, Movement::CharSearch(finalized)) - } - } - } + if y > 0 { + self.term.write(&format!("\r\x1b[{}A", y)); } - if let E(K::Char(digit @ '0'..='9'), M::NONE) = key { - pending_cmd.append_digit(digit); - return self.get_normal_cmd(pending_cmd); - } - let cmd = match key { - E(K::Char('h'), M::NONE) => { - let cmd = pending_cmd - .with_movement(Movement::BackwardChar) - .build()?; - LineCmd::ViCmd(cmd) - } - E(K::Char('.'), M::NONE) => { - match &self.last_vicmd { - None => LineCmd::Null, - Some(cmd) => { - build_verb!(pending_cmd, Verb::Repeat(cmd.clone()))? - } - } - } - E(K::Char('j'), M::NONE) => LineCmd::LineDownOrNextHistory, - E(K::Char('k'), M::NONE) => LineCmd::LineUpOrPreviousHistory, - E(K::Char('D'), M::NONE) => build_moveverb!(pending_cmd,Verb::Delete,Movement::EndOfLine)?, - E(K::Char('C'), M::NONE) => build_moveverb!(pending_cmd,Verb::Change,Movement::EndOfLine)?, - E(K::Char('Y'), M::NONE) => build_moveverb!(pending_cmd,Verb::Yank,Movement::EndOfLine)?, - E(K::Char('l'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardChar)?, - E(K::Char('w'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardWord(At::Start, Word::Normal))?, - E(K::Char('W'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardWord(At::Start, Word::Big))?, - E(K::Char('b'), M::NONE) => build_movement!(pending_cmd,Movement::BackwardWord(Word::Normal))?, - E(K::Char('B'), M::NONE) => build_movement!(pending_cmd,Movement::BackwardWord(Word::Big))?, - E(K::Char('e'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardWord(At::BeforeEnd, Word::Normal))?, - E(K::Char('E'), M::NONE) => build_movement!(pending_cmd,Movement::ForwardWord(At::BeforeEnd, Word::Big))?, - E(K::Char('^'), M::NONE) => build_movement!(pending_cmd,Movement::BeginningOfFirstWord)?, - E(K::Char('0'), M::NONE) => build_movement!(pending_cmd,Movement::BeginningOfLine)?, - E(K::Char('$'), M::NONE) => build_movement!(pending_cmd,Movement::EndOfLine)?, - E(K::Char('x'), M::NONE) => build_verb!(pending_cmd,Verb::DeleteOne(Anchor::After))?, - E(K::Char('o'), M::NONE) => { - self.set_insert_mode(); - build_verb!(pending_cmd,Verb::Breakline(Anchor::After))? - } - E(K::Char('O'), M::NONE) => { - self.set_insert_mode(); - build_verb!(pending_cmd,Verb::Breakline(Anchor::Before))? - } - E(K::Char('i'), M::NONE) => { - self.set_insert_mode(); - LineCmd::Null - } - E(K::Char('I'), M::NONE) => { - self.set_insert_mode(); - build_movement!(pending_cmd,Movement::BeginningOfFirstWord)? - } - E(K::Char('a'), M::NONE) => { - self.set_insert_mode(); - build_movement!(pending_cmd,Movement::ForwardChar)? - } - E(K::Char('A'), M::NONE) => { - self.set_insert_mode(); - build_movement!(pending_cmd,Movement::EndOfLine)? - } - E(K::Char('c'), M::NONE) => { - if pending_cmd.verb() == Some(&Verb::Change) { - build_moveverb!(pending_cmd,Verb::Change,Movement::WholeLine)? - } else { - pending_cmd = pending_cmd.with_verb(Verb::Change); - self.get_normal_cmd(pending_cmd)? - } - } - E(K::Char('>'), M::NONE) => { - if pending_cmd.verb() == Some(&Verb::Indent) { - build_verb!(pending_cmd,Verb::Indent)? - } else { - pending_cmd = pending_cmd.with_verb(Verb::Indent); - self.get_normal_cmd(pending_cmd)? - } - } - E(K::Char('<'), M::NONE) => { - if pending_cmd.verb() == Some(&Verb::Dedent) { - build_verb!(pending_cmd,Verb::Dedent)? - } else { - pending_cmd = pending_cmd.with_verb(Verb::Dedent); - self.get_normal_cmd(pending_cmd)? - } - } - E(K::Char('d'), M::NONE) => { - if pending_cmd.verb() == Some(&Verb::Delete) { - LineCmd::ViCmd(pending_cmd.with_movement(Movement::WholeLine).build()?) - } else { - pending_cmd = pending_cmd.with_verb(Verb::Delete); - self.get_normal_cmd(pending_cmd)? - } - } - E(K::Char('f'), M::NONE) => { - pending_cmd = pending_cmd.with_movement(Movement::CharSearch(CharSearch::FindFwd(None))); - self.get_normal_cmd(pending_cmd)? - } - E(K::Char('F'), M::NONE) => { - pending_cmd = pending_cmd.with_movement(Movement::CharSearch(CharSearch::FindBkwd(None))); - self.get_normal_cmd(pending_cmd)? - } - E(K::Char('t'), M::NONE) => { - pending_cmd = pending_cmd.with_movement(Movement::CharSearch(CharSearch::FwdTo(None))); - self.get_normal_cmd(pending_cmd)? - } - E(K::Char('T'), M::NONE) => { - pending_cmd = pending_cmd.with_movement(Movement::CharSearch(CharSearch::BkwdTo(None))); - self.get_normal_cmd(pending_cmd)? - } - _ => { - flog!(INFO, "unhandled key in get_normal_cmd, trying common_cmd..."); - return self.common_cmd(key, pending_cmd) - } - }; - Ok(cmd) - } + // Add prompt offset to X only if cursor is on the last line (y == 0) + let cursor_x = if y == 0 { x + last_line_len } else { x }; - pub fn common_cmd(&mut self, key: KeyEvent, pending_cmd: ViCmdBuilder) -> ShResult { - use keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; - match key { - E(K::Home, M::NONE) => build_movement!(pending_cmd,Movement::BeginningOfLine), - E(K::End, M::NONE) => build_movement!(pending_cmd,Movement::EndOfLine), - E(K::Left, M::NONE) => build_movement!(pending_cmd,Movement::BackwardChar), - E(K::Right, M::NONE) => build_movement!(pending_cmd,Movement::ForwardChar), - E(K::Delete, M::NONE) => build_moveverb!(pending_cmd,Verb::Delete,Movement::ForwardChar), - E(K::Up, M::NONE) => Ok(LineCmd::LineUpOrPreviousHistory), - E(K::Down, M::NONE) => Ok(LineCmd::LineDownOrNextHistory), - E(K::Enter, M::NONE) => Ok(LineCmd::AcceptLine), - E(K::Char('D'), M::CTRL) => Ok(LineCmd::EndOfFile), - E(K::Backspace, M::NONE) | - E(K::Char('h'), M::CTRL) => { - Ok(LineCmd::backspace()) + self.term.write(&format!("\r\x1b[{}C", cursor_x)); + self.term.write(&self.mode.cursor_style()); + } + pub fn readline(&mut self) -> ShResult { + self.print_buf(false); + loop { + let key = self.term.read_key(); + let Some(cmd) = self.mode.handle_key(key) else { + continue + }; + + if cmd.should_submit() { + return Ok(self.line.to_string()); } - _ => Err(ShErr::simple(ShErrKind::ReadlineErr,format!("Unhandled common key event: {key:?}"))) + + self.exec_cmd(cmd.clone())?; + self.print_buf(true); } } - pub fn handle_repeat(&mut self, cmd: &ViCmd) -> ShResult<()> { - Ok(()) - } - pub fn exec_vi_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { - self.last_vicmd = Some(Repeat::from_cmd(cmd.clone())); - match cmd { - ViCmd::MoveVerb(verb_cmd, move_cmd) => { - let VerbCmd { verb_count, verb } = verb_cmd; - for _ in 0..verb_count { - self.line.exec_vi_cmd(Some(verb.clone()), Some(move_cmd.clone()))?; - } - if verb == Verb::Change { - self.set_insert_mode(); - } + pub fn exec_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { + if cmd.is_mode_transition() { + let count = cmd.verb_count(); + let mut mode: Box = match cmd.verb().unwrap() { + Verb::InsertMode => Box::new(ViInsert::new().with_count(count)), + Verb::NormalMode => Box::new(ViNormal::new()), + Verb::VisualMode => todo!(), + Verb::OverwriteMode => todo!(), + _ => unreachable!() + }; + + std::mem::swap(&mut mode, &mut self.mode); + self.term.write(&mode.cursor_style()); + + if mode.is_repeatable() { + self.repeat_action = mode.as_replay(); } - ViCmd::Verb(verb_cmd) => { - let VerbCmd { verb_count, verb } = verb_cmd; - for _ in 0..verb_count { - self.line.exec_vi_cmd(Some(verb.clone()), None)?; - } - } - ViCmd::Move(move_cmd) => { - self.line.exec_vi_cmd(None, Some(move_cmd))?; - } - } - Ok(()) - } - pub fn execute_cmd(&mut self, cmd: LineCmd) -> ShResult<()> { - match cmd { - LineCmd::ViCmd(cmd) => self.exec_vi_cmd(cmd)?, - LineCmd::Abort => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::BeginningOfHistory => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::CapitalizeWord => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::ClearScreen => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Complete => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::CompleteBackward => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::CompleteHint => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::DowncaseWord => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::EndOfFile => { - if self.line.buffer.is_empty() { - sh_quit(0); - } else { - self.line.clear(); - } - } - LineCmd::EndOfHistory => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::ForwardSearchHistory => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::HistorySearchBackward => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::HistorySearchForward => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Insert(_) => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Interrupt => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Move(_) => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::NextHistory => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Noop => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Repaint => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Overwrite(ch) => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::PreviousHistory => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::QuotedInsert => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::ReverseSearchHistory => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Suspend => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::TransposeChars => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::TransposeWords => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Unknown => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::YankPop => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::LineUpOrPreviousHistory => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::LineDownOrNextHistory => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Newline => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::AcceptOrInsertLine { .. } => todo!("Unhandled cmd: {cmd:?}"), - LineCmd::Null => { /* Pass */ } - _ => todo!("Unhandled cmd: {cmd:?}"), - } + } + self.line.exec_cmd(cmd)?; Ok(()) } } - -impl Drop for FernReader { - fn drop(&mut self) { - self.term.write("\x1b[2 q"); - } -} - diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs new file mode 100644 index 0000000..4fcf3f0 --- /dev/null +++ b/src/prompt/readline/mode.rs @@ -0,0 +1,360 @@ +use super::keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; +use super::linebuf::TermChar; +use super::vicmd::{Anchor, Bound, Dest, Direction, Motion, MotionBuilder, TextObj, To, Verb, VerbBuilder, ViCmd, Word}; + +pub struct CmdReplay { + cmds: Vec, + repeat: u16 +} + +impl CmdReplay { + pub fn new(cmds: Vec, repeat: u16) -> Self { + Self { cmds, repeat } + } +} + +pub trait ViMode { + fn handle_key(&mut self, key: E) -> Option; + fn is_repeatable(&self) -> bool; + fn as_replay(&self) -> Option; + fn cursor_style(&self) -> String; +} + +#[derive(Default,Debug)] +pub struct ViInsert { + cmds: Vec, + pending_cmd: ViCmd, + repeat_count: u16 +} + +impl ViInsert { + pub fn new() -> Self { + Self::default() + } + pub fn with_count(mut self, repeat_count: u16) -> Self { + self.repeat_count = repeat_count; + self + } + pub fn register_and_return(&mut self) -> Option { + let cmd = self.take_cmd(); + self.register_cmd(&cmd); + return Some(cmd) + } + pub fn register_cmd(&mut self, cmd: &ViCmd) { + self.cmds.push(cmd.clone()) + } + pub fn take_cmd(&mut self) -> ViCmd { + std::mem::take(&mut self.pending_cmd) + } +} + +impl ViMode for ViInsert { + fn handle_key(&mut self, key: E) -> Option { + match key { + E(K::Grapheme(ch), M::NONE) => { + let ch = TermChar::from(ch); + self.pending_cmd.set_verb(Verb::InsertChar(ch)); + self.pending_cmd.set_motion(Motion::ForwardChar); + self.register_and_return() + } + E(K::Char(ch), M::NONE) => { + self.pending_cmd.set_verb(Verb::InsertChar(TermChar::from(ch))); + self.pending_cmd.set_motion(Motion::ForwardChar); + self.register_and_return() + } + E(K::Char('H'), M::CTRL) | + E(K::Backspace, M::NONE) => { + self.pending_cmd.set_verb(Verb::Delete); + self.pending_cmd.set_motion(Motion::BackwardChar); + self.register_and_return() + } + + E(K::BackTab, M::NONE) => { + self.pending_cmd.set_verb(Verb::CompleteBackward); + self.register_and_return() + } + + E(K::Char('I'), M::CTRL) | + E(K::Tab, M::NONE) => { + self.pending_cmd.set_verb(Verb::Complete); + self.register_and_return() + } + + E(K::Esc, M::NONE) => { + self.pending_cmd.set_verb(Verb::NormalMode); + self.pending_cmd.set_motion(Motion::BackwardChar); + self.register_and_return() + } + _ => common_cmds(key) + } + } + + fn is_repeatable(&self) -> bool { + true + } + + fn as_replay(&self) -> Option { + Some(CmdReplay::new(self.cmds.clone(), self.repeat_count)) + } + + fn cursor_style(&self) -> String { + "\x1b[6 q".to_string() + } +} + +#[derive(Default,Debug)] +pub struct ViNormal { + pending_cmd: ViCmd, +} + +impl ViNormal { + pub fn new() -> Self { + Self::default() + } + pub fn take_cmd(&mut self) -> ViCmd { + std::mem::take(&mut self.pending_cmd) + } + pub fn clear_cmd(&mut self) { + self.pending_cmd = ViCmd::new(); + } + fn handle_pending_builder(&mut self, key: E) -> Option { + if self.pending_cmd.wants_register { + if let E(K::Char(ch @ ('a'..='z' | 'A'..='Z')), M::NONE) = key { + self.pending_cmd.set_register(ch); + return None + } else { + self.clear_cmd(); + return None + } + } else if let Some(Verb::Builder(_)) = &self.pending_cmd.verb { + todo!() // Don't have any verb builders yet, but might later + } else if let Some(Motion::Builder(builder)) = self.pending_cmd.motion.clone() { + match builder { + MotionBuilder::CharSearch(direction, dest, _) => { + if let E(K::Char(ch), M::NONE) = key { + self.pending_cmd.set_motion(Motion::CharSearch( + direction.unwrap(), + dest.unwrap(), + ch.into(), + )); + return Some(self.take_cmd()); + } else { + self.clear_cmd(); + return None; + } + } + MotionBuilder::TextObj(_, bound) => { + if let Some(bound) = bound { + if let E(K::Char(ch), M::NONE) = key { + let obj = match ch { + 'w' => TextObj::Word(Word::Normal), + 'W' => TextObj::Word(Word::Big), + '(' | ')' => TextObj::Paren, + '[' | ']' => TextObj::Bracket, + '{' | '}' => TextObj::Brace, + '<' | '>' => TextObj::Angle, + '"' => TextObj::DoubleQuote, + '\'' => TextObj::SingleQuote, + '`' => TextObj::BacktickQuote, + _ => TextObj::Custom(ch), + }; + self.pending_cmd.set_motion(Motion::TextObj(obj, bound)); + return Some(self.take_cmd()); + } else { + self.clear_cmd(); + return None; + } + } else if let E(K::Char(ch), M::NONE) = key { + let bound = match ch { + 'i' => Bound::Inside, + 'a' => Bound::Around, + _ => { + self.clear_cmd(); + return None; + } + }; + self.pending_cmd.set_motion(Motion::Builder(MotionBuilder::TextObj(None, Some(bound)))); + return None; + } else { + self.clear_cmd(); + return None; + } + } + } + } + None + } +} + +impl ViMode for ViNormal { + fn handle_key(&mut self, key: E) -> Option { + if let E(K::Char(ch),M::NONE) = key { + self.pending_cmd.append_seq_char(ch); + } + if self.pending_cmd.is_building() { + return self.handle_pending_builder(key) + } + match key { + E(K::Char(digit @ '0'..='9'), M::NONE) => self.pending_cmd.append_digit(digit), + E(K::Char('"'),M::NONE) => { + if self.pending_cmd.is_empty() { + if self.pending_cmd.register().name().is_none() { + self.pending_cmd.wants_register = true; + } else { + self.clear_cmd(); + } + } else { + self.clear_cmd(); + } + return None + } + E(K::Char('i'),M::NONE) if self.pending_cmd.verb().is_some() => { + self.pending_cmd.set_motion(Motion::Builder(MotionBuilder::TextObj(None, Some(Bound::Inside)))); + } + E(K::Char('a'),M::NONE) if self.pending_cmd.verb().is_some() => { + self.pending_cmd.set_motion(Motion::Builder(MotionBuilder::TextObj(None, Some(Bound::Around)))); + } + E(K::Char('h'),M::NONE) => self.pending_cmd.set_motion(Motion::BackwardChar), + E(K::Char('j'),M::NONE) => self.pending_cmd.set_motion(Motion::LineDown), + E(K::Char('k'),M::NONE) => self.pending_cmd.set_motion(Motion::LineUp), + E(K::Char('l'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardChar), + E(K::Char('w'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardWord(To::Start, Word::Normal)), + E(K::Char('W'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardWord(To::Start, Word::Big)), + E(K::Char('e'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardWord(To::End, Word::Normal)), + E(K::Char('E'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardWord(To::End, Word::Big)), + E(K::Char('b'),M::NONE) => self.pending_cmd.set_motion(Motion::BackwardWord(Word::Normal)), + E(K::Char('B'),M::NONE) => self.pending_cmd.set_motion(Motion::BackwardWord(Word::Big)), + E(K::Char('x'),M::NONE) => self.pending_cmd.set_verb(Verb::DeleteChar(Anchor::After)), + E(K::Char('X'),M::NONE) => self.pending_cmd.set_verb(Verb::DeleteChar(Anchor::Before)), + E(K::Char('d'),M::NONE) => { + if self.pending_cmd.verb().is_none() { + self.pending_cmd.set_verb(Verb::Delete) + } else if let Some(verb) = self.pending_cmd.verb() { + if verb == &Verb::Delete { + self.pending_cmd.set_motion(Motion::WholeLine); + } else { + self.clear_cmd(); + } + } + } + E(K::Char('c'),M::NONE) => { + if self.pending_cmd.verb().is_none() { + self.pending_cmd.set_verb(Verb::Change) + } else if let Some(verb) = self.pending_cmd.verb() { + if verb == &Verb::Change { + self.pending_cmd.set_motion(Motion::WholeLine); + } else { + self.clear_cmd(); + } + } + } + E(K::Char('y'),M::NONE) => { + if self.pending_cmd.verb().is_none() { + self.pending_cmd.set_verb(Verb::Yank) + } else if let Some(verb) = self.pending_cmd.verb() { + if verb == &Verb::Yank { + self.pending_cmd.set_motion(Motion::WholeLine); + } else { + self.clear_cmd(); + } + } + } + E(K::Char('p'),M::NONE) => self.pending_cmd.set_verb(Verb::Put(Anchor::After)), + E(K::Char('P'),M::NONE) => self.pending_cmd.set_verb(Verb::Put(Anchor::Before)), + E(K::Char('D'),M::NONE) => { + self.pending_cmd.set_verb(Verb::Delete); + self.pending_cmd.set_motion(Motion::EndOfLine); + } + E(K::Char('f'),M::NONE) => { + let builder = MotionBuilder::CharSearch( + Some(Direction::Forward), + Some(Dest::On), + None + ); + self.pending_cmd.set_motion(Motion::Builder(builder)); + } + E(K::Char('F'),M::NONE) => { + let builder = MotionBuilder::CharSearch( + Some(Direction::Backward), + Some(Dest::On), + None + ); + self.pending_cmd.set_motion(Motion::Builder(builder)); + } + E(K::Char('t'),M::NONE) => { + let builder = MotionBuilder::CharSearch( + Some(Direction::Forward), + Some(Dest::Before), + None + ); + self.pending_cmd.set_motion(Motion::Builder(builder)); + } + E(K::Char('T'),M::NONE) => { + let builder = MotionBuilder::CharSearch( + Some(Direction::Backward), + Some(Dest::Before), + None + ); + self.pending_cmd.set_motion(Motion::Builder(builder)); + } + E(K::Char('i'),M::NONE) => { + self.pending_cmd.set_verb(Verb::InsertMode); + } + E(K::Char('I'),M::NONE) => { + self.pending_cmd.set_verb(Verb::InsertMode); + self.pending_cmd.set_motion(Motion::BeginningOfFirstWord); + } + E(K::Char('a'),M::NONE) => { + self.pending_cmd.set_verb(Verb::InsertMode); + self.pending_cmd.set_motion(Motion::ForwardChar); + } + E(K::Char('A'),M::NONE) => { + self.pending_cmd.set_verb(Verb::InsertMode); + self.pending_cmd.set_motion(Motion::EndOfLine); + } + _ => return common_cmds(key) + } + if self.pending_cmd.is_complete() { + Some(self.take_cmd()) + } else { + None + } + } + + fn is_repeatable(&self) -> bool { + false + } + + fn as_replay(&self) -> Option { + None + } + + fn cursor_style(&self) -> String { + "\x1b[2 q".to_string() + } +} + +pub fn common_cmds(key: E) -> Option { + let mut pending_cmd = ViCmd::new(); + match key { + E(K::Home, M::NONE) => pending_cmd.set_motion(Motion::BeginningOfLine), + E(K::End, M::NONE) => pending_cmd.set_motion(Motion::EndOfLine), + E(K::Left, M::NONE) => pending_cmd.set_motion(Motion::BackwardChar), + E(K::Right, M::NONE) => pending_cmd.set_motion(Motion::ForwardChar), + E(K::Up, M::NONE) => pending_cmd.set_motion(Motion::LineUp), + E(K::Down, M::NONE) => pending_cmd.set_motion(Motion::LineDown), + E(K::Enter, M::NONE) => pending_cmd.set_verb(Verb::AcceptLine), + E(K::Char('D'), M::CTRL) => pending_cmd.set_verb(Verb::EndOfFile), + E(K::Backspace, M::NONE) | + E(K::Char('H'), M::CTRL) => { + pending_cmd.set_verb(Verb::Delete); + pending_cmd.set_motion(Motion::BackwardChar); + } + E(K::Delete, M::NONE) => { + pending_cmd.set_verb(Verb::Delete); + pending_cmd.set_motion(Motion::ForwardChar); + } + _ => return None + } + Some(pending_cmd) +} diff --git a/src/prompt/readline/register.rs b/src/prompt/readline/register.rs new file mode 100644 index 0000000..f5eeabe --- /dev/null +++ b/src/prompt/readline/register.rs @@ -0,0 +1,171 @@ +use std::sync::Mutex; + +use super::linebuf::TermCharBuf; + +pub static REGISTERS: Mutex = Mutex::new(Registers::new()); + +pub fn read_register(ch: Option) -> Option { + let lock = REGISTERS.lock().unwrap(); + lock.get_reg(ch).map(|r| r.buf().clone()) +} + +pub fn write_register(ch: Option, buf: TermCharBuf) { + let mut lock = REGISTERS.lock().unwrap(); + if let Some(r) = lock.get_reg_mut(ch) { r.write(buf) } +} + +pub fn append_register(ch: Option, buf: TermCharBuf) { + let mut lock = REGISTERS.lock().unwrap(); + if let Some(r) = lock.get_reg_mut(ch) { r.append(buf) } +} + +#[derive(Default,Debug)] +pub struct Registers { + default: Register, + a: Register, + b: Register, + c: Register, + d: Register, + e: Register, + f: Register, + g: Register, + h: Register, + i: Register, + j: Register, + k: Register, + l: Register, + m: Register, + n: Register, + o: Register, + p: Register, + q: Register, + r: Register, + s: Register, + t: Register, + u: Register, + v: Register, + w: Register, + x: Register, + y: Register, + z: Register, +} + +impl Registers { + pub const fn new() -> Self { + Self { + default: Register(TermCharBuf(vec![])), + a: Register(TermCharBuf(vec![])), + b: Register(TermCharBuf(vec![])), + c: Register(TermCharBuf(vec![])), + d: Register(TermCharBuf(vec![])), + e: Register(TermCharBuf(vec![])), + f: Register(TermCharBuf(vec![])), + g: Register(TermCharBuf(vec![])), + h: Register(TermCharBuf(vec![])), + i: Register(TermCharBuf(vec![])), + j: Register(TermCharBuf(vec![])), + k: Register(TermCharBuf(vec![])), + l: Register(TermCharBuf(vec![])), + m: Register(TermCharBuf(vec![])), + n: Register(TermCharBuf(vec![])), + o: Register(TermCharBuf(vec![])), + p: Register(TermCharBuf(vec![])), + q: Register(TermCharBuf(vec![])), + r: Register(TermCharBuf(vec![])), + s: Register(TermCharBuf(vec![])), + t: Register(TermCharBuf(vec![])), + u: Register(TermCharBuf(vec![])), + v: Register(TermCharBuf(vec![])), + w: Register(TermCharBuf(vec![])), + x: Register(TermCharBuf(vec![])), + y: Register(TermCharBuf(vec![])), + z: Register(TermCharBuf(vec![])), + } + } + pub fn get_reg(&self, ch: Option) -> Option<&Register> { + let Some(ch) = ch else { + return Some(&self.default) + }; + match ch { + 'a' => Some(&self.a), + 'b' => Some(&self.b), + 'c' => Some(&self.c), + 'd' => Some(&self.d), + 'e' => Some(&self.e), + 'f' => Some(&self.f), + 'g' => Some(&self.g), + 'h' => Some(&self.h), + 'i' => Some(&self.i), + 'j' => Some(&self.j), + 'k' => Some(&self.k), + 'l' => Some(&self.l), + 'm' => Some(&self.m), + 'n' => Some(&self.n), + 'o' => Some(&self.o), + 'p' => Some(&self.p), + 'q' => Some(&self.q), + 'r' => Some(&self.r), + 's' => Some(&self.s), + 't' => Some(&self.t), + 'u' => Some(&self.u), + 'v' => Some(&self.v), + 'w' => Some(&self.w), + 'x' => Some(&self.x), + 'y' => Some(&self.y), + 'z' => Some(&self.z), + _ => None + } + } + pub fn get_reg_mut(&mut self, ch: Option) -> Option<&mut Register> { + let Some(ch) = ch else { + return Some(&mut self.default) + }; + match ch { + 'a' => Some(&mut self.a), + 'b' => Some(&mut self.b), + 'c' => Some(&mut self.c), + 'd' => Some(&mut self.d), + 'e' => Some(&mut self.e), + 'f' => Some(&mut self.f), + 'g' => Some(&mut self.g), + 'h' => Some(&mut self.h), + 'i' => Some(&mut self.i), + 'j' => Some(&mut self.j), + 'k' => Some(&mut self.k), + 'l' => Some(&mut self.l), + 'm' => Some(&mut self.m), + 'n' => Some(&mut self.n), + 'o' => Some(&mut self.o), + 'p' => Some(&mut self.p), + 'q' => Some(&mut self.q), + 'r' => Some(&mut self.r), + 's' => Some(&mut self.s), + 't' => Some(&mut self.t), + 'u' => Some(&mut self.u), + 'v' => Some(&mut self.v), + 'w' => Some(&mut self.w), + 'x' => Some(&mut self.x), + 'y' => Some(&mut self.y), + 'z' => Some(&mut self.z), + _ => None + } + } +} + +#[derive(Clone,Default,Debug)] +pub struct Register(TermCharBuf); + +impl Register { + pub fn buf(&self) -> &TermCharBuf { + &self.0 + } + pub fn write(&mut self, buf: TermCharBuf) { + self.0 = buf + } + pub fn append(&mut self, mut buf: TermCharBuf) { + self.0.0.append(&mut buf.0) + } + pub fn clear(&mut self) { + self.0.clear() + } +} diff --git a/src/prompt/readline/term.rs b/src/prompt/readline/term.rs index a402bfd..7780e56 100644 --- a/src/prompt/readline/term.rs +++ b/src/prompt/readline/term.rs @@ -1,5 +1,5 @@ -use std::os::fd::{BorrowedFd, RawFd}; -use nix::{libc::STDIN_FILENO, sys::termios, unistd::{isatty, read, write}}; +use std::{os::fd::{BorrowedFd, RawFd}, thread::sleep, time::{Duration, Instant}}; +use nix::{errno::Errno, fcntl::{fcntl, FcntlArg, OFlag}, libc::STDIN_FILENO, sys::termios, unistd::{isatty, read, write}}; use super::keys::{KeyCode, KeyEvent, ModKeys}; @@ -48,6 +48,44 @@ impl Terminal { }) } + /// Same as read_byte(), only non-blocking with a very short timeout + pub fn peek_byte(&self, buf: &mut [u8]) -> usize { + const TIMEOUT_DUR: Duration = Duration::from_millis(50); + Self::with_raw_mode(|| { + self.read_blocks(false); + + let start = Instant::now(); + loop { + match read(self.stdin, buf) { + Ok(n) if n > 0 => { + self.read_blocks(true); + return n + } + Ok(_) => {} + Err(e) if e == Errno::EAGAIN => {} + Err(e) => panic!("nonblocking read failed: {e}") + } + + if start.elapsed() >= TIMEOUT_DUR { + self.read_blocks(true); + return 0 + } + + sleep(Duration::from_millis(1)); + } + }) + } + + pub fn read_blocks(&self, yn: bool) { + let flags = OFlag::from_bits_truncate(fcntl(self.stdin, FcntlArg::F_GETFL).unwrap()); + let new_flags = if !yn { + flags | OFlag::O_NONBLOCK + } else { + flags & !OFlag::O_NONBLOCK + }; + fcntl(self.stdin, FcntlArg::F_SETFL(new_flags)).unwrap(); + } + pub fn write_bytes(&self, buf: &[u8]) { Self::with_raw_mode(|| { write(unsafe{BorrowedFd::borrow_raw(self.stdout)}, buf).expect("Failed to write to stdout"); @@ -69,27 +107,56 @@ impl Terminal { } pub fn read_key(&self) -> KeyEvent { - let mut buf = [0;8]; - let n = self.read_byte(&mut buf); + use core::str; - if buf[0] == 0x1b { - if n >= 3 && buf[1] == b'[' { - return match buf[2] { - b'A' => KeyEvent(KeyCode::Up, ModKeys::empty()), - b'B' => KeyEvent(KeyCode::Down, ModKeys::empty()), - b'C' => KeyEvent(KeyCode::Right, ModKeys::empty()), - b'D' => KeyEvent(KeyCode::Left, ModKeys::empty()), - _ => KeyEvent(KeyCode::Esc, ModKeys::empty()), - }; + let mut buf = [0u8; 8]; + let mut collected = Vec::with_capacity(5); + + loop { + let n = self.read_byte(&mut buf[..1]); // Read one byte at a time + if n == 0 { + continue; } - return KeyEvent(KeyCode::Esc, ModKeys::empty()); - } + collected.push(buf[0]); - if let Ok(s) = core::str::from_utf8(&buf[..n]) { - if let Some(ch) = s.chars().next() { - return KeyEvent::new(ch, ModKeys::NONE); + // ESC sequences + if collected[0] == 0x1b && collected.len() == 1 { + // Peek next byte if any + let n = self.peek_byte(&mut buf[..1]); + if n == 0 { + return KeyEvent(KeyCode::Esc, ModKeys::empty()); + } + collected.push(buf[0]); + + if buf[0] == b'[' { + // Read third byte + let _ = self.read_byte(&mut buf[..1]); + collected.push(buf[0]); + + return match buf[0] { + b'A' => KeyEvent(KeyCode::Up, ModKeys::empty()), + b'B' => KeyEvent(KeyCode::Down, ModKeys::empty()), + b'C' => KeyEvent(KeyCode::Right, ModKeys::empty()), + b'D' => KeyEvent(KeyCode::Left, ModKeys::empty()), + _ => KeyEvent(KeyCode::Esc, ModKeys::empty()), + }; + } + + return KeyEvent(KeyCode::Esc, ModKeys::empty()); + } + + // Try parse valid UTF-8 from collected bytes + if let Ok(s) = str::from_utf8(&collected) { + return KeyEvent::new(s, ModKeys::empty()); + } + + // If it's not valid UTF-8 yet, loop to collect more bytes + if collected.len() >= 4 { + // UTF-8 max char length is 4; if it's still invalid, give up + break; } } + KeyEvent(KeyCode::Null, ModKeys::empty()) } diff --git a/src/prompt/readline/vicmd.rs b/src/prompt/readline/vicmd.rs new file mode 100644 index 0000000..e1d1e3f --- /dev/null +++ b/src/prompt/readline/vicmd.rs @@ -0,0 +1,294 @@ +use super::{linebuf::{TermChar, TermCharBuf}, register::{append_register, read_register, write_register}}; + +#[derive(Clone,Copy,Default,Debug)] +pub struct RegisterName { + name: Option, + append: bool +} + +impl RegisterName { + pub fn name(&self) -> Option { + self.name + } + pub fn is_append(&self) -> bool { + self.append + } + pub fn write_to_register(&self, buf: TermCharBuf) { + if self.append { + append_register(self.name, buf); + } else { + write_register(self.name, buf); + } + } + pub fn read_from_register(&self) -> Option { + read_register(self.name) + } +} + +#[derive(Clone,Default,Debug)] +pub struct ViCmd { + pub wants_register: bool, // Waiting for register character + + /// Register to read from/write to + pub register_count: Option, + pub register: RegisterName, + + /// Verb to perform + pub verb_count: Option, + pub verb: Option, + + /// Motion to perform + pub motion_count: Option, + pub motion: Option, + + /// Count digits are held here until we know what we are counting + /// Once a register/verb/motion is set, the count is taken from here + pub pending_count: Option, + + /// The actual keys the user typed for this command + /// Maybe display this somewhere around the prompt later? + /// Prompt escape sequence maybe? + pub raw_seq: String, +} + +impl ViCmd { + pub fn new() -> Self { + Self::default() + } + pub fn set_register(&mut self, register: char) { + let append = register.is_uppercase(); + let name = Some(register.to_ascii_lowercase()); + let reg_name = RegisterName { name, append }; + self.register = reg_name; + self.register_count = self.pending_count.take(); + self.wants_register = false; + } + pub fn append_seq_char(&mut self, ch: char) { + self.raw_seq.push(ch) + } + pub fn is_empty(&self) -> bool { + !self.wants_register && + self.register.name.is_none() && + self.verb_count.is_none() && + self.verb.is_none() && + self.motion_count.is_none() && + self.motion.is_none() + } + pub fn set_verb(&mut self, verb: Verb) { + self.verb = Some(verb); + self.verb_count = self.pending_count.take(); + } + pub fn set_motion(&mut self, motion: Motion) { + self.motion = Some(motion); + self.motion_count = self.pending_count.take(); + } + pub fn register(&self) -> RegisterName { + self.register + } + pub fn verb(&self) -> Option<&Verb> { + self.verb.as_ref() + } + pub fn verb_count(&self) -> u16 { + self.verb_count.unwrap_or(1) + } + pub fn motion(&self) -> Option<&Motion> { + self.motion.as_ref() + } + pub fn motion_count(&self) -> u16 { + self.motion_count.unwrap_or(1) + } + pub fn append_digit(&mut self, digit: char) { + // Convert char digit to a number (assuming ASCII '0'..'9') + let digit_val = digit.to_digit(10).expect("digit must be 0-9") as u16; + self.pending_count = Some(match self.pending_count { + Some(count) => count * 10 + digit_val, + None => digit_val, + }); + } + pub fn is_building(&self) -> bool { + matches!(self.verb, Some(Verb::Builder(_))) || + matches!(self.motion, Some(Motion::Builder(_))) || + self.wants_register + } + pub fn is_complete(&self) -> bool { + !( + (self.verb.is_none() && self.motion.is_none()) || + (self.verb.is_none() && self.motion.as_ref().is_some_and(|m| m.needs_verb())) || + (self.motion.is_none() && self.verb.as_ref().is_some_and(|v| v.needs_motion())) || + self.is_building() + ) + } + pub fn should_submit(&self) -> bool { + self.verb.as_ref().is_some_and(|v| *v == Verb::AcceptLine) + } + pub fn is_mode_transition(&self) -> bool { + self.verb.as_ref().is_some_and(|v| { + matches!(*v, Verb::InsertMode | Verb::NormalMode | Verb::OverwriteMode | Verb::VisualMode) + }) + } +} + +#[derive(Debug, Clone, Eq, PartialEq)] +#[non_exhaustive] +pub enum Verb { + Delete, + DeleteChar(Anchor), + Change, + Yank, + ReplaceChar(char), + Substitute, + ToggleCase, + Complete, + CompleteBackward, + Undo, + RepeatLast, + Put(Anchor), + OverwriteMode, + InsertMode, + NormalMode, + VisualMode, + JoinLines, + InsertChar(TermChar), + Insert(String), + Breakline(Anchor), + Indent, + Dedent, + AcceptLine, + Builder(VerbBuilder), + EndOfFile +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum VerbBuilder { +} + +impl Verb { + pub fn needs_motion(&self) -> bool { + matches!(self, + Self::Indent | + Self::Dedent | + Self::Delete | + Self::Change | + Self::Yank + ) + } +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum Motion { + /// Whole current line (not really a movement but a range) + WholeLine, + TextObj(TextObj, Bound), + BeginningOfFirstWord, + /// beginning-of-line + BeginningOfLine, + /// end-of-line + EndOfLine, + /// backward-word, vi-prev-word + BackwardWord(Word), // Backward until start of word + /// forward-word, vi-end-word, vi-next-word + ForwardWord(To, Word), // Forward until start/end of word + /// character-search, character-search-backward, vi-char-search + CharSearch(Direction,Dest,TermChar), + /// backward-char + BackwardChar, + /// forward-char + ForwardChar, + /// move to the same column on the previous line + LineUp, + /// move to the same column on the next line + LineDown, + /// Whole user input (not really a movement but a range) + WholeBuffer, + /// beginning-of-register + BeginningOfBuffer, + /// end-of-register + EndOfBuffer, + Builder(MotionBuilder), + Null +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum MotionBuilder { + CharSearch(Option,Option,Option), + TextObj(Option,Option) +} + +impl Motion { + pub fn needs_verb(&self) -> bool { + matches!(self, Self::TextObj(_, _)) + } +} + +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum Anchor { + After, + Before +} +#[derive(Debug, Clone, Eq, PartialEq)] +pub enum TextObj { + /// `iw`, `aw` — inner word, around word + Word(Word), + + /// for stuff like 'dd' + Line, + + /// `is`, `as` — inner sentence, around sentence + Sentence, + + /// `ip`, `ap` — inner paragraph, around paragraph + Paragraph, + + /// `i"`, `a"` — inner/around double quotes + DoubleQuote, + /// `i'`, `a'` + SingleQuote, + /// `i\``, `a\`` + BacktickQuote, + + /// `i)`, `a)` — round parens + Paren, + /// `i]`, `a]` + Bracket, + /// `i}`, `a}` + Brace, + /// `i<`, `a<` + Angle, + + /// `it`, `at` — HTML/XML tags (if you support it) + Tag, + + /// Custom user-defined objects maybe? + Custom(char), +} + +#[derive(Debug, Copy, Clone, Eq, PartialEq)] +pub enum Word { + Big, + Normal +} +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub enum Bound { + Inside, + Around +} + +#[derive(Default, Debug, Clone, Copy, Eq, PartialEq)] +pub enum Direction { + #[default] + Forward, + Backward +} + +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub enum Dest { + On, + Before, + After +} + +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub enum To { + Start, + End +} diff --git a/src/prompt/readline_old.rs b/src/prompt/readline_old.rs deleted file mode 100644 index 4050835..0000000 --- a/src/prompt/readline_old.rs +++ /dev/null @@ -1,86 +0,0 @@ -use rustyline::{completion::Completer, hint::{Hint, Hinter}, history::SearchDirection, validate::{ValidationResult, Validator}, Helper}; - -use crate::{libsh::term::{Style, Styled}, parse::{lex::{LexFlags, LexStream}, ParseStream}}; -use crate::prelude::*; - -#[derive(Default,Debug)] -pub struct FernReadline; - -impl FernReadline { - pub fn new() -> Self { - Self - } - pub fn search_hist(value: &str, ctx: &rustyline::Context<'_>) -> Option { - let len = ctx.history().len(); - for i in 0..len { - let entry = ctx.history().get(i, SearchDirection::Reverse).unwrap().unwrap(); - if entry.entry.starts_with(value) { - return Some(entry.entry.into_owned()) - } - } - None - } -} - -impl Helper for FernReadline {} - -impl Completer for FernReadline { - type Candidate = String; -} - -pub struct FernHint { - raw: String, - styled: String -} - -impl FernHint { - pub fn new(raw: String) -> Self { - let styled = (&raw).styled(Style::Dim | Style::BrightBlack); - Self { raw, styled } - } -} - -impl Hint for FernHint { - fn display(&self) -> &str { - &self.styled - } - fn completion(&self) -> Option<&str> { - if !self.raw.is_empty() { - Some(&self.raw) - } else { - None - } - } -} - -impl Hinter for FernReadline { - type Hint = FernHint; - fn hint(&self, line: &str, pos: usize, ctx: &rustyline::Context<'_>) -> Option { - if line.is_empty() { - return None - } - let ent = Self::search_hist(line,ctx)?; - let entry_raw = ent.get(pos..)?.to_string(); - Some(FernHint::new(entry_raw)) - } -} - -impl Validator for FernReadline { - fn validate(&self, ctx: &mut rustyline::validate::ValidationContext) -> rustyline::Result { - let mut tokens = vec![]; - let tk_stream = LexStream::new(Arc::new(ctx.input().to_string()), LexFlags::empty()); - for tk in tk_stream { - if tk.is_err() { - return Ok(ValidationResult::Incomplete) - } - tokens.push(tk.unwrap()); - } - let nd_stream = ParseStream::new(tokens); - for nd in nd_stream { - if nd.is_err() { - return Ok(ValidationResult::Incomplete) - } - } - Ok(ValidationResult::Valid(None)) - } -} From 9db6137934b844d7c7eb539d8a8516f6bf405463 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Fri, 23 May 2025 02:14:56 -0400 Subject: [PATCH 11/19] more work on vi stuff --- src/prompt/readline/linebuf.rs | 614 ++++++++++++++++++++++++------ src/prompt/readline/mod.rs | 107 +++++- src/prompt/readline/mode.rs | 657 +++++++++++++++++++++------------ src/prompt/readline/term.rs | 58 ++- src/prompt/readline/vicmd.rs | 167 +++++---- 5 files changed, 1176 insertions(+), 427 deletions(-) diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index 81d6906..48ef3a4 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -1,8 +1,9 @@ -use std::{fmt::Display, ops::{Deref, DerefMut, Range}, sync::Arc}; +use std::{fmt::Display, ops::{Deref, DerefMut, Range, RangeBounds, RangeInclusive}, sync::Arc}; use unicode_width::UnicodeWidthStr; use crate::libsh::{error::ShResult, sys::sh_quit, term::{Style, Styled}}; +use crate::prelude::*; use super::vicmd::{Anchor, Bound, Dest, Direction, Motion, RegisterName, TextObj, To, Verb, ViCmd, Word}; @@ -12,15 +13,35 @@ pub enum CharClass { Symbol } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq)] pub enum MotionKind { Forward(usize), To(usize), Backward(usize), - Range(usize,usize), + Range(Range), Null } +impl MotionKind { + pub fn range>(range: R) -> Self { + let start = match range.start_bound() { + std::ops::Bound::Included(&start) => start, + std::ops::Bound::Excluded(&start) => start + 1, + std::ops::Bound::Unbounded => 0 + }; + let end = match range.end_bound() { + std::ops::Bound::Included(&end) => end, + std::ops::Bound::Excluded(&end) => end + 1, + std::ops::Bound::Unbounded => panic!("called range constructor with no upper bound") + }; + if end > start { + Self::Range(start..end) + } else { + Self::Range(end..start) + } + } +} + #[derive(Clone,Default,Debug)] pub struct TermCharBuf(pub Vec); @@ -162,10 +183,71 @@ fn is_other_class_or_ws(a: &TermChar, b: &TermChar) -> bool { CharClass::from(a) != CharClass::from(b) } +pub struct UndoPayload { + buffer: TermCharBuf, + cursor: usize +} + +#[derive(Default,Debug)] +pub struct Edit { + pub pos: usize, + pub cursor_pos: usize, + pub old: TermCharBuf, + pub new: TermCharBuf +} + +impl Edit { + pub fn diff(a: TermCharBuf, b: TermCharBuf, old_cursor_pos: usize) -> Self { + use std::cmp::min; + + let mut start = 0; + let max_start = min(a.len(), b.len()); + + // Calculate the prefix of the edit + while start < max_start && a[start] == b[start] { + start += 1; + } + + if start == a.len() && start == b.len() { + return Edit { + pos: start, + cursor_pos: old_cursor_pos, + old: TermCharBuf(vec![]), + new: TermCharBuf(vec![]), + } + } + + let mut end_a = a.len(); + let mut end_b = b.len(); + + // Calculate the suffix of the edit + while end_a > start && end_b > start && a[end_a - 1] == b[end_b - 1] { + end_a -= 1; + end_b -= 1; + } + + // Slice off the prefix and suffix for both + let old = TermCharBuf(a[start..end_a].to_vec()); + let new = TermCharBuf(b[start..end_b].to_vec()); + + Edit { + pos: start, + cursor_pos: old_cursor_pos, + old, + new + } + } +} + #[derive(Default,Debug)] pub struct LineBuf { buffer: TermCharBuf, cursor: usize, + clamp_cursor: bool, + merge_edit: bool, + undo_stack: Vec, + redo_stack: Vec, + term_dims: (usize,usize) } impl LineBuf { @@ -179,6 +261,9 @@ impl LineBuf { } self } + pub fn set_cursor_clamp(&mut self, yn: bool) { + self.clamp_cursor = yn + } pub fn buffer(&self) -> &TermCharBuf { &self.buffer } @@ -197,8 +282,26 @@ impl LineBuf { let cursor = self.cursor(); self.buffer.insert(cursor,tc) } - pub fn count_lines(&self) -> usize { - self.buffer.iter().filter(|&c| c == &TermChar::Newline).count() + pub fn count_lines(&self, first_line_offset: usize) -> usize { + let mut cur_line_len = 0; + let mut lines = 1; + let first_line_max_len = self.term_dims.1.saturating_sub(first_line_offset); + for char in self.buffer.iter() { + match char { + TermChar::Newline => { + lines += 1; + cur_line_len = 0; + } + TermChar::Grapheme(str) => { + cur_line_len += str.width().max(1); + if (lines == 1 && first_line_max_len > 0 && cur_line_len >= first_line_max_len) || cur_line_len > self.term_dims.1 { + lines += 1; + cur_line_len = 0; + } + } + } + } + lines } pub fn cursor_back(&mut self, count: usize) { self.cursor = self.cursor.saturating_sub(count) @@ -217,13 +320,23 @@ impl LineBuf { self.cursor = self.cursor.saturating_sub(1) } } - pub fn cursor_display_coords(&self) -> (usize, usize) { + pub fn update_term_dims(&mut self, x: usize, y: usize) { + self.term_dims = (x,y) + } + pub fn cursor_display_coords(&self, first_line_offset: Option) -> (usize, usize) { let mut x = 0; let mut y = 0; + let first_line_max_len = first_line_offset.map(|fl| self.term_dims.1.saturating_sub(fl)).unwrap_or_default(); for i in 0..self.cursor() { let ch = self.get_char(i).unwrap(); match ch { - TermChar::Grapheme(str) => x += str.width().max(1), + TermChar::Grapheme(str) => { + x += str.width().max(1); + if (y == 0 && first_line_max_len > 0 && x >= first_line_max_len) || x > self.term_dims.1 { + y += 1; + x = 0; + } + } TermChar::Newline => { y += 1; x = 0; @@ -246,20 +359,6 @@ impl LineBuf { lines.push(cur_line); lines } - pub fn display_lines(&self) -> Vec { - let line_bullet = "∙ ".styled(Style::Dim); - self.split_lines() - .into_iter() - .enumerate() - .map(|(i, line)| { - if i == 0 { - line.to_string() - } else { - format!("{line_bullet}{line}") - } - }) - .collect() - } pub fn on_word_bound(&self, word: Word, pos: usize, dir: Direction) -> bool { let check_pos = match dir { Direction::Forward => self.num_or_len(pos + 1), @@ -276,6 +375,7 @@ impl LineBuf { }) } fn backward_until bool>(&self, mut start: usize, cond: F, inclusive: bool) -> usize { + start = self.num_or_len_minus_one(start); while start > 0 && !cond(&self.buffer[start]) { start -= 1; } @@ -401,7 +501,18 @@ impl LineBuf { pos = self.backward_until(pos, |c| c.is_whitespace(), false); } } - To::End => unreachable!() + To::End => { + if self.on_word_bound(word, pos, dir) { + pos = pos.saturating_sub(1); + } + + if self.get_char(pos).is_some_and(|c| c.is_whitespace()) { + pos = self.backward_until(pos, |c| !c.is_whitespace(), true); + } else { + pos = self.backward_until(pos, |c| c.is_whitespace(), true); + pos = self.backward_until(pos, |c| !c.is_whitespace(), true); + } + } } } Word::Normal => { @@ -419,7 +530,24 @@ impl LineBuf { pos = self.backward_until(pos, |c| is_other_class_or_ws(this_char, c), false); } } - To::End => unreachable!() + To::End => { + if self.on_word_bound(word, pos, dir) { + // Nudge + pos = pos.saturating_sub(1); + } + // If we are on whitespace, proceed until we are not, inclusively + if self.get_char(pos).is_some_and(|c| c.is_whitespace()) { + pos = self.backward_until(pos, |c| !c.is_whitespace(), true) + } else { + // If we are not on whitespace, proceed until we hit something different, inclusively + let this_char = self.get_char(pos).unwrap(); + pos = self.backward_until(pos, |c| is_other_class_or_ws(this_char, c), true); + // If we landed on whitespace, proceed until we are not on whitespace + if self.get_char(pos).is_some_and(|c| c.is_whitespace()) { + pos = self.backward_until(pos, |c| !c.is_whitespace(), true) + } + } + } } } } @@ -427,9 +555,196 @@ impl LineBuf { } pos } + pub fn eval_quote_obj(&self, target: &str, bound: Bound) -> Range { + let mut end; + let start; + let cursor = self.cursor(); + let ln_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); + let mut line_chars = self.buffer[ln_start..cursor].iter(); + let mut in_quote = false; + while let Some(ch) = line_chars.next() { + let TermChar::Grapheme(ch) = ch else { unreachable!() }; + match ch.as_ref() { + "\\" => { + line_chars.next(); + } + "\"" => in_quote = !in_quote, + _ => { /* continue */ } + } + } + let mut start_pos = cursor; + let end_pos; + if !in_quote { + start_pos = self.forward_until(start_pos, |c| c.matches("\n") || c.matches(target), true); + if !self.get_char(start_pos).is_some_and(|c| c.matches(target)) { + return cursor..cursor + } + end_pos = self.forward_until(start_pos, |c| c.matches("\n") || c.matches(target), true); + if !self.get_char(end_pos).is_some_and(|c| c.matches(target)) { + return cursor..cursor + } + start = start_pos; + end = end_pos; + } else { + start_pos = self.backward_until(start_pos, |c| c.matches("\n") || c.matches(target), true); + if !self.get_char(start_pos).is_some_and(|c| c.matches(target)) { + return cursor..cursor + } + end_pos = self.forward_until(self.num_or_len(start_pos + 1), |c| c.matches("\n") || c.matches(target), true); + if !self.get_char(end_pos).is_some_and(|c| c.matches(target)) { + return cursor..cursor + } + start = start_pos; + end = self.num_or_len(end_pos + 1); + + if bound == Bound::Around && self.get_char(end).is_some_and(|c| c.is_whitespace()) { + end += 1; + end = self.forward_until(end, |c| !c.is_whitespace(), true); + } + } + mk_range(start,end) + } + pub fn eval_delim_obj(&self, obj: &TextObj, bound: Bound) -> Range { + // FIXME: logic isn't completely robust i think + let opener = match obj { + TextObj::Brace => "{", + TextObj::Bracket => "[", + TextObj::Paren => "(", + TextObj::Angle => "<", + _ => unreachable!() + }; + let closer = match obj { + TextObj::Brace => "}", + TextObj::Bracket => "]", + TextObj::Paren => ")", + TextObj::Angle => ">", + _ => unreachable!() + }; + let mut end = None; + let mut start = None; + let mut delim_count: usize = 0; + let ln_range = self.cur_line_range(); + let cursor = self.cursor(); + let mut ln_chars = self.buffer[*ln_range.start()..cursor].iter().enumerate(); + while let Some((i,ch)) = ln_chars.next() { + let &TermChar::Grapheme(ch) = &ch else { unreachable!() }; + match ch.as_ref() { + "\\" => { + ln_chars.next(); + } + ch if ch == opener => { + start = Some(ln_range.start() + i); + delim_count += 1; + } + ch if ch == closer => delim_count -= 1, + _ => {} + } + } + + let mut start_pos = None; + let mut end_pos = None; + if delim_count == 0 { + let mut ln_chars = self.buffer[cursor..*ln_range.end()].iter().enumerate(); + while let Some((i,ch)) = ln_chars.next() { + let &TermChar::Grapheme(ch) = &ch else { unreachable!() }; + match ch.as_ref() { + "\\" => { + ln_chars.next(); + } + ch if ch == opener => { + if delim_count == 0 { + start_pos = Some(cursor + i); + } + delim_count += 1; + } + ch if ch == closer => { + delim_count -= 1; + if delim_count == 0 { + end_pos = Some(cursor + i); + } + } + _ => {} + } + } + + if start_pos.is_none() || end_pos.is_none() { + return cursor..cursor + } else { + start = start_pos; + end = end_pos; + } + } else { + let Some(strt) = start else { + dbg!("no start"); + dbg!("no start"); + dbg!("no start"); + dbg!("no start"); + dbg!("no start"); + dbg!("no start"); + return cursor..cursor + }; + let strt = self.num_or_len(strt + 1); // skip the paren + let target = delim_count.saturating_sub(1); + let mut ln_chars = self.buffer[strt..*ln_range.end()].iter().enumerate(); + dbg!(&ln_chars); + dbg!(&ln_chars); + dbg!(&ln_chars); + dbg!(&ln_chars); + + while let Some((i,ch)) = ln_chars.next() { + let &TermChar::Grapheme(ch) = &ch else { unreachable!() }; + match ch.as_ref() { + "\\" => { + ln_chars.next(); + } + ch if ch == opener => { + delim_count += 1; + } + ch if ch == closer => { + delim_count -= 1; + if delim_count == target { + end_pos = Some(strt + i); + } + } + _ => {} + } + } + dbg!(end_pos); + dbg!(end_pos); + dbg!(end_pos); + dbg!(start_pos); + dbg!(start_pos); + dbg!(start_pos); + dbg!(start_pos); + dbg!(start_pos); + dbg!(start_pos); + dbg!(start_pos); + if end_pos.is_none() { + return cursor..cursor + } else { + end = end_pos; + } + } + + let Some(mut start) = start else { + return cursor..cursor + }; + let Some(mut end) = end else { + return cursor..cursor + }; + match bound { + Bound::Inside => { + end = end.saturating_sub(1); + start = self.num_or_len(start + 1); + mk_range(start,end) + } + Bound::Around => mk_range(start,end) + } + + } pub fn eval_text_obj(&self, obj: TextObj, bound: Bound) -> Range { - let mut start = self.cursor(); - let mut end = self.cursor(); + let mut start; + let mut end; match obj { TextObj::Word(word) => { @@ -455,84 +770,59 @@ impl LineBuf { } TextObj::Sentence => todo!(), TextObj::Paragraph => todo!(), - TextObj::DoubleQuote => { - let cursor = self.cursor(); - let ln_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); - let mut line_chars = self.buffer[ln_start..cursor].iter(); - let mut in_quote = false; - while let Some(ch) = line_chars.next() { - let TermChar::Grapheme(ch) = ch else { unreachable!() }; - match ch.as_ref() { - "\\" => { - line_chars.next(); - } - "\"" => in_quote = !in_quote, - _ => { /* continue */ } - } - } - let mut start_pos = cursor; - let end_pos; - if !in_quote { - start_pos = self.forward_until(start_pos, |c| c.matches("\n") || c.matches("\""), true); - if !self.get_char(start_pos).is_some_and(|c| c.matches("\"")) { - return cursor..cursor - } - end_pos = self.forward_until(start_pos, |c| c.matches("\n") || c.matches("\""), true); - if !self.get_char(end_pos).is_some_and(|c| c.matches("\"")) { - return cursor..cursor - } - start = start_pos; - end = end_pos; - } else { - start_pos = self.backward_until(start_pos, |c| c.matches("\n") || c.matches("\""), true); - if !self.get_char(start_pos).is_some_and(|c| c.matches("\"")) { - return cursor..cursor - } - end_pos = self.forward_until(self.num_or_len(start_pos + 1), |c| c.matches("\n") || c.matches("\""), true); - if !self.get_char(end_pos).is_some_and(|c| c.matches("\"")) { - return cursor..cursor - } - start = start_pos; - end = self.num_or_len(end_pos + 1); - - if bound == Bound::Around && self.get_char(end).is_some_and(|c| c.is_whitespace()) { - end += 1; - end = self.forward_until(end, |c| !c.is_whitespace(), true); - } - } - } - TextObj::SingleQuote => todo!(), - TextObj::BacktickQuote => todo!(), - TextObj::Paren => todo!(), - TextObj::Bracket => todo!(), - TextObj::Brace => todo!(), - TextObj::Angle => todo!(), + TextObj::DoubleQuote => return self.eval_quote_obj("\"", bound), + TextObj::SingleQuote => return self.eval_quote_obj("'", bound), + TextObj::BacktickQuote => return self.eval_quote_obj("`", bound), + TextObj::Paren | + TextObj::Bracket | + TextObj::Brace | + TextObj::Angle => return self.eval_delim_obj(&obj, bound), TextObj::Tag => todo!(), TextObj::Custom(_) => todo!(), } if bound == Bound::Inside { - start = self.num_or_len(start + 1); + start = self.num_or_len_minus_one(start + 1); end = end.saturating_sub(1); } start..end } + pub fn validate_range(&self, range: &Range) -> bool { + range.end < self.buffer.len() + } + pub fn cur_line_range(&self) -> RangeInclusive { + let cursor = self.cursor(); + let mut line_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); + let mut line_end = self.forward_until(cursor, |c| c == &TermChar::Newline, true); + if self.get_char(line_start.saturating_sub(1)).is_none_or(|c| c != &TermChar::Newline) { + line_start = 0; + } + if self.get_char(line_end).is_none_or(|c| c != &TermChar::Newline) { + line_end = self.buffer.len().saturating_sub(1); + line_start = self.backward_until(line_start, |c| c == &TermChar::Newline, true) + } + + line_start..=self.num_or_len(line_end + 1) + } /// Clamp a number to the length of the buffer - pub fn num_or_len(&self, num: usize) -> usize { + pub fn num_or_len_minus_one(&self, num: usize) -> usize { num.min(self.buffer.len().saturating_sub(1)) } + pub fn num_or_len(&self, num: usize) -> usize { + num.min(self.buffer.len()) + } pub fn eval_motion(&self, motion: Motion) -> MotionKind { match motion { - Motion::WholeLine => { - let cursor = self.cursor(); - let start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); - let end = self.forward_until(cursor, |c| c == &TermChar::Newline, true); - MotionKind::Range(start,end) - } + Motion::WholeLine => MotionKind::range(self.cur_line_range()), Motion::TextObj(text_obj, bound) => { let range = self.eval_text_obj(text_obj, bound); let range = mk_range(range.start, range.end); - MotionKind::Range(range.start,range.end) + let cursor = self.cursor(); + if range.start == cursor && range.end == cursor { + MotionKind::Null + } else { + MotionKind::range(range) + } } Motion::BeginningOfFirstWord => { let cursor = self.cursor(); @@ -540,17 +830,29 @@ impl LineBuf { let first_print = self.forward_until(line_start, |c| !c.is_whitespace(), true); MotionKind::To(first_print) } + Motion::ToColumn(col) => { + let rng = self.cur_line_range(); + let column = (*rng.start() + (col.saturating_sub(1))).min(*rng.end()); + MotionKind::To(column) + } Motion::BeginningOfLine => { let cursor = self.cursor(); - let line_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); + let mut line_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); + if self.get_char(line_start.saturating_sub(1)).is_some_and(|c| c != &TermChar::Newline) { + line_start = 0; // FIXME: not sure if this logic is correct + } MotionKind::To(line_start) } Motion::EndOfLine => { let cursor = self.cursor(); - let line_end = self.forward_until(cursor, |c| c == &TermChar::Newline, false); + let mut line_end = self.forward_until(cursor, |c| c == &TermChar::Newline, false); + // If we didn't actually find a newline, we need to go to the end of the buffer + if self.get_char(line_end + 1).is_some_and(|c| c != &TermChar::Newline) { + line_end = self.buffer.len(); // FIXME: not sure if this logic is correct + } MotionKind::To(line_end) } - Motion::BackwardWord(word) => MotionKind::To(self.find_word_pos(word, To::Start, Direction::Backward)), + Motion::BackwardWord(dest, word) => MotionKind::To(self.find_word_pos(word, dest, Direction::Backward)), Motion::ForwardWord(dest, word) => MotionKind::To(self.find_word_pos(word, dest, Direction::Forward)), Motion::CharSearch(direction, dest, ch) => { let mut cursor = self.cursor(); @@ -590,11 +892,19 @@ impl LineBuf { MotionKind::Null } } + Motion::Range(s, e) => { + if self.validate_range(&(s..e)) { + let range = mk_range(s, e); + MotionKind::range(range) + } else { + MotionKind::Null + } + } Motion::BackwardChar => MotionKind::Backward(1), Motion::ForwardChar => MotionKind::Forward(1), Motion::LineUp => todo!(), Motion::LineDown => todo!(), - Motion::WholeBuffer => MotionKind::Range(0,self.buffer.len().saturating_sub(1)), + Motion::WholeBuffer => MotionKind::Range(0..self.buffer.len().saturating_sub(1)), Motion::BeginningOfBuffer => MotionKind::To(0), Motion::EndOfBuffer => MotionKind::To(self.buffer.len().saturating_sub(1)), Motion::Null => MotionKind::Null, @@ -623,9 +933,9 @@ impl LineBuf { deleted = self.buffer.drain(back..cursor).collect::(); self.apply_motion(MotionKind::To(back)); } - MotionKind::Range(s, e) => { - deleted = self.buffer.drain(s..e).collect::(); - self.apply_motion(MotionKind::To(s)); + MotionKind::Range(r) => { + deleted = self.buffer.drain(r.clone()).collect::(); + self.apply_motion(MotionKind::To(r.start)); } MotionKind::Null => return Ok(()) } @@ -672,23 +982,55 @@ impl LineBuf { .collect::(); self.apply_motion(MotionKind::To(back)); } - MotionKind::Range(s, e) => { - yanked = self.buffer[s..e] + MotionKind::Range(r) => { + yanked = self.buffer[r.start..r.end] .iter() .cloned() .collect::(); - self.apply_motion(MotionKind::To(s)); + self.apply_motion(MotionKind::To(r.start)); } MotionKind::Null => return Ok(()) } register.write_to_register(yanked); } - Verb::ReplaceChar(_) => todo!(), + Verb::ReplaceChar(ch) => { + let cursor = self.cursor(); + if let Some(c) = self.buffer.get_mut(cursor) { + let mut tc = TermChar::from(ch); + std::mem::swap(c, &mut tc) + } + self.apply_motion(motion); + } Verb::Substitute => todo!(), Verb::ToggleCase => todo!(), Verb::Complete => todo!(), Verb::CompleteBackward => todo!(), - Verb::Undo => todo!(), + Verb::Undo => { + let Some(undo) = self.undo_stack.pop() else { + return Ok(()) + }; + flog!(DEBUG, undo); + let Edit { pos, cursor_pos, old, new } = undo; + let start = pos; + let end = pos + new.len(); + self.buffer.0.splice(start..end, old.0.clone()); + let cur_pos = self.cursor(); + self.cursor = cursor_pos; + let redo = Edit { pos, cursor_pos: cur_pos, old: new, new: old }; + flog!(DEBUG, redo); + self.redo_stack.push(redo); + } + Verb::Redo => { + let Some(Edit { pos, cursor_pos, old, new }) = self.redo_stack.pop() else { + return Ok(()) + }; + let start = pos; + let end = pos + new.len(); + self.buffer.0.splice(start..end, old.0.clone()); + let cur_pos = self.cursor(); + self.cursor = cursor_pos; + self.undo_stack.push(Edit { pos, cursor_pos: cur_pos, old: new, new: old }); + } Verb::RepeatLast => todo!(), Verb::Put(anchor) => { if let Some(charbuf) = register.read_from_register() { @@ -697,8 +1039,8 @@ impl LineBuf { self.cursor_back(1); } for char in chars { - self.insert_at_cursor(char); self.cursor_fwd(1); + self.insert_at_cursor(char); } } } @@ -720,6 +1062,19 @@ impl LineBuf { self.cursor = 0; } } + Verb::InsertModeLineBreak(anchor) => { + match anchor { + Anchor::After => { + let rng = self.cur_line_range(); + self.apply_motion(MotionKind::To(self.num_or_len(rng.end() + 1))); + self.insert_at_cursor('\n'.into()); + self.apply_motion(MotionKind::Forward(1)); + } + Anchor::Before => todo!(), + } + } + Verb::Equalize => { + } Verb::InsertMode | Verb::NormalMode | Verb::VisualMode | @@ -734,29 +1089,80 @@ impl LineBuf { MotionKind::Forward(n) => self.cursor_fwd(n), MotionKind::To(pos) => self.cursor_to(pos), MotionKind::Backward(n) => self.cursor_back(n), - MotionKind::Range(s, _) => self.cursor_to(s), // TODO: not sure if this is correct in every case + MotionKind::Range(r) => self.cursor_to(r.start), // TODO: not sure if this is correct in every case MotionKind::Null => { /* Pass */ } } } + pub fn handle_edit(&mut self, old: TermCharBuf, new: TermCharBuf, curs_pos: usize) { + if self.merge_edit { + let mut diff = Edit::diff(old, new, curs_pos); + let Some(mut edit) = self.undo_stack.pop() else { + self.undo_stack.push(diff); + return + }; + dbg!("old"); + dbg!(&edit); + + edit.new.append(&mut diff.new); + dbg!("new"); + dbg!(&edit); + + self.undo_stack.push(edit); + } else { + let diff = Edit::diff(old, new, curs_pos); + self.undo_stack.push(diff); + } + } pub fn exec_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { - let ViCmd { register, verb_count, verb, motion_count, motion, .. } = cmd; + flog!(DEBUG, cmd); + let clear_redos = !cmd.is_undo_op() || cmd.verb.as_ref().is_some_and(|v| v.1.is_edit()); + let is_char_insert = cmd.verb.as_ref().is_some_and(|v| v.1.is_char_insert()); + let is_undo_op = cmd.is_undo_op(); + + // Merge character inserts into one edit + if self.merge_edit && cmd.verb.as_ref().is_none_or(|v| !v.1.is_char_insert()) { + self.merge_edit = false; + } + + let ViCmd { register, verb, motion, .. } = cmd; + + let verb_count = verb.as_ref().map(|v| v.0); + let motion_count = motion.as_ref().map(|m| m.0); + + let before = self.buffer.clone(); + let cursor_pos = self.cursor(); for _ in 0..verb_count.unwrap_or(1) { for _ in 0..motion_count.unwrap_or(1) { let motion = motion .clone() - .map(|m| self.eval_motion(m)) + .map(|m| self.eval_motion(m.1)) .unwrap_or(MotionKind::Null); if let Some(verb) = verb.clone() { - self.exec_verb(verb, motion, register)?; + self.exec_verb(verb.1, motion, register)?; } else { self.apply_motion(motion); } } } - self.clamp_cursor(); + let after = self.buffer.clone(); + if clear_redos { + self.redo_stack.clear(); + } + + if before.0 != after.0 && !is_undo_op { + self.handle_edit(before, after, cursor_pos); + } + + if is_char_insert { + self.merge_edit = true; + } + + if self.clamp_cursor { + self.clamp_cursor(); + } Ok(()) } } diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 1bb8752..56d65ea 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -4,9 +4,10 @@ use linebuf::{strip_ansi_codes_and_escapes, LineBuf, TermCharBuf}; use mode::{CmdReplay, ViInsert, ViMode, ViNormal}; use term::Terminal; use unicode_width::UnicodeWidthStr; -use vicmd::{Verb, ViCmd}; +use vicmd::{MotionCmd, RegisterName, Verb, VerbCmd, ViCmd}; -use crate::libsh::{error::ShResult, term::{Style, Styled}}; +use crate::libsh::{error::{ShErr, ShErrKind, ShResult}, term::{Style, Styled}}; +use crate::prelude::*; pub mod keys; pub mod term; @@ -20,7 +21,8 @@ pub struct FernVi { line: LineBuf, prompt: String, mode: Box, - repeat_action: Option, + last_action: Option, + last_movement: Option, } impl FernVi { @@ -33,19 +35,22 @@ impl FernVi { line, prompt, mode: Box::new(ViInsert::new()), - repeat_action: None, + last_action: None, + last_movement: None, } } pub fn clear_line(&self) { let prompt_lines = self.prompt.lines().count(); + let last_line_len = strip_ansi_codes_and_escapes(self.prompt.lines().last().unwrap_or_default()).width(); let buf_lines = if self.prompt.ends_with('\n') { - self.line.count_lines() + self.line.count_lines(last_line_len) } else { // The prompt does not end with a newline, so one of the buffer's lines overlaps with it - self.line.count_lines().saturating_sub(1) + self.line.count_lines(last_line_len).saturating_sub(1) }; let total = prompt_lines + buf_lines; self.term.write_bytes(b"\r\n"); + self.term.write_bytes(format!("\r\x1b[{total}B").as_bytes()); for _ in 0..total { self.term.write_bytes(b"\r\x1b[2K\x1b[1A"); } @@ -57,7 +62,7 @@ impl FernVi { } let mut prompt_lines = self.prompt.lines().peekable(); let mut last_line_len = 0; - let lines = self.line.display_lines(); + let lines = self.line.split_lines(); while let Some(line) = prompt_lines.next() { if prompt_lines.peek().is_none() { last_line_len = strip_ansi_codes_and_escapes(line).width(); @@ -66,9 +71,9 @@ impl FernVi { self.term.writeln(line); } } - let num_lines = lines.len(); let mut lines_iter = lines.into_iter().peekable(); + let pos = self.term.cursor_pos(); while let Some(line) = lines_iter.next() { if lines_iter.peek().is_some() { self.term.writeln(&line); @@ -76,23 +81,30 @@ impl FernVi { self.term.write(&line); } } + self.term.move_cursor_to(pos); - let (x, y) = self.line.cursor_display_coords(); - let y = num_lines.saturating_sub(y + 1); + let (x, y) = self.line.cursor_display_coords(Some(last_line_len)); if y > 0 { - self.term.write(&format!("\r\x1b[{}A", y)); + self.term.write(&format!("\r\x1b[{}B", y)); } - // Add prompt offset to X only if cursor is on the last line (y == 0) + let cursor_x = if y == 0 { x + last_line_len } else { x }; - self.term.write(&format!("\r\x1b[{}C", cursor_x)); + if cursor_x > 0 { + self.term.write(&format!("\r\x1b[{}C", cursor_x)); + } self.term.write(&self.mode.cursor_style()); } pub fn readline(&mut self) -> ShResult { + let dims = self.term.get_dimensions()?; + self.line.update_term_dims(dims.0, dims.1); self.print_buf(false); loop { + let dims = self.term.get_dimensions()?; + self.line.update_term_dims(dims.0, dims.1); + let key = self.term.read_key(); let Some(cmd) = self.mode.handle_key(key) else { continue @@ -109,9 +121,16 @@ impl FernVi { pub fn exec_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { if cmd.is_mode_transition() { let count = cmd.verb_count(); - let mut mode: Box = match cmd.verb().unwrap() { - Verb::InsertMode => Box::new(ViInsert::new().with_count(count)), - Verb::NormalMode => Box::new(ViNormal::new()), + let mut mode: Box = match cmd.verb().unwrap().1 { + Verb::InsertModeLineBreak(_) | + Verb::InsertMode => { + self.line.set_cursor_clamp(false); + Box::new(ViInsert::new().with_count(count as u16)) + } + Verb::NormalMode => { + self.line.set_cursor_clamp(true); + Box::new(ViNormal::new()) + } Verb::VisualMode => todo!(), Verb::OverwriteMode => todo!(), _ => unreachable!() @@ -121,10 +140,60 @@ impl FernVi { self.term.write(&mode.cursor_style()); if mode.is_repeatable() { - self.repeat_action = mode.as_replay(); + self.last_action = mode.as_replay(); } - } - self.line.exec_cmd(cmd)?; + } else if cmd.is_cmd_repeat() { + let Some(replay) = self.last_action.clone() else { + return Ok(()) + }; + let ViCmd { register, verb, motion, raw_seq } = cmd; + let VerbCmd(count,_) = verb.unwrap(); + match replay { + CmdReplay::ModeReplay { cmds, mut repeat } => { + if count > 1 { + repeat = count as u16; + } + for _ in 0..repeat { + let cmds = cmds.clone(); + for cmd in cmds { + self.line.exec_cmd(cmd)? + } + } + } + CmdReplay::Single(mut cmd) => { + if count > 1 { + // Override the counts with the one passed to the '.' command + if cmd.verb.is_some() { + cmd.verb.as_mut().map(|v| v.0 = count); + cmd.motion.as_mut().map(|m| m.0 = 0); + } else { + return Ok(()) // it has to have a verb to be repeatable, something weird happened + } + } + self.line.exec_cmd(cmd)?; + } + _ => unreachable!("motions should be handled in the other branch") + } + return Ok(()) + } else if cmd.is_motion_repeat() { + match cmd.verb.as_ref().unwrap().1 { + Verb::RepeatMotion => { + let Some(motion) = self.last_movement.clone() else { + return Ok(()) + }; + let repeat_cmd = ViCmd { + register: RegisterName::default(), + verb: None, + motion: Some(motion), + raw_seq: ";".into() + }; + self.line.exec_cmd(repeat_cmd)?; + } + Verb::RepeatMotionRev => {} + _ => unreachable!() + } + } + self.line.exec_cmd(cmd.clone())?; Ok(()) } } diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs index 4fcf3f0..72b2632 100644 --- a/src/prompt/readline/mode.rs +++ b/src/prompt/readline/mode.rs @@ -1,16 +1,36 @@ +use std::iter::Peekable; +use std::str::Chars; + +use nix::NixPath; + use super::keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; use super::linebuf::TermChar; -use super::vicmd::{Anchor, Bound, Dest, Direction, Motion, MotionBuilder, TextObj, To, Verb, VerbBuilder, ViCmd, Word}; +use super::vicmd::{Anchor, Bound, Dest, Direction, Motion, MotionBuilder, MotionCmd, RegisterName, TextObj, To, Verb, VerbBuilder, VerbCmd, ViCmd, Word}; +use crate::prelude::*; -pub struct CmdReplay { - cmds: Vec, - repeat: u16 +#[derive(Debug,Clone)] +pub enum CmdReplay { + ModeReplay { cmds: Vec, repeat: u16 }, + Single(ViCmd), + Motion(Motion) } impl CmdReplay { - pub fn new(cmds: Vec, repeat: u16) -> Self { - Self { cmds, repeat } + pub fn mode(cmds: Vec, repeat: u16) -> Self { + Self::ModeReplay { cmds, repeat } } + pub fn single(cmd: ViCmd) -> Self { + Self::Single(cmd) + } + pub fn motion(motion: Motion) -> Self { + Self::Motion(motion) + } +} + +pub enum CmdState { + Pending, + Complete, + Invalid } pub trait ViMode { @@ -18,6 +38,7 @@ pub trait ViMode { fn is_repeatable(&self) -> bool; fn as_replay(&self) -> Option; fn cursor_style(&self) -> String; + fn pending_seq(&self) -> Option; } #[derive(Default,Debug)] @@ -53,36 +74,36 @@ impl ViMode for ViInsert { match key { E(K::Grapheme(ch), M::NONE) => { let ch = TermChar::from(ch); - self.pending_cmd.set_verb(Verb::InsertChar(ch)); - self.pending_cmd.set_motion(Motion::ForwardChar); + self.pending_cmd.set_verb(VerbCmd(1,Verb::InsertChar(ch))); + self.pending_cmd.set_motion(MotionCmd(1,Motion::ForwardChar)); self.register_and_return() } E(K::Char(ch), M::NONE) => { - self.pending_cmd.set_verb(Verb::InsertChar(TermChar::from(ch))); - self.pending_cmd.set_motion(Motion::ForwardChar); + self.pending_cmd.set_verb(VerbCmd(1,Verb::InsertChar(TermChar::from(ch)))); + self.pending_cmd.set_motion(MotionCmd(1,Motion::ForwardChar)); self.register_and_return() } E(K::Char('H'), M::CTRL) | E(K::Backspace, M::NONE) => { - self.pending_cmd.set_verb(Verb::Delete); - self.pending_cmd.set_motion(Motion::BackwardChar); + self.pending_cmd.set_verb(VerbCmd(1,Verb::Delete)); + self.pending_cmd.set_motion(MotionCmd(1,Motion::BackwardChar)); self.register_and_return() } E(K::BackTab, M::NONE) => { - self.pending_cmd.set_verb(Verb::CompleteBackward); + self.pending_cmd.set_verb(VerbCmd(1,Verb::CompleteBackward)); self.register_and_return() } E(K::Char('I'), M::CTRL) | E(K::Tab, M::NONE) => { - self.pending_cmd.set_verb(Verb::Complete); + self.pending_cmd.set_verb(VerbCmd(1,Verb::Complete)); self.register_and_return() } E(K::Esc, M::NONE) => { - self.pending_cmd.set_verb(Verb::NormalMode); - self.pending_cmd.set_motion(Motion::BackwardChar); + self.pending_cmd.set_verb(VerbCmd(1,Verb::NormalMode)); + self.pending_cmd.set_motion(MotionCmd(1,Motion::BackwardChar)); self.register_and_return() } _ => common_cmds(key) @@ -94,230 +115,416 @@ impl ViMode for ViInsert { } fn as_replay(&self) -> Option { - Some(CmdReplay::new(self.cmds.clone(), self.repeat_count)) + Some(CmdReplay::mode(self.cmds.clone(), self.repeat_count)) } fn cursor_style(&self) -> String { "\x1b[6 q".to_string() } + fn pending_seq(&self) -> Option { + None + } } #[derive(Default,Debug)] pub struct ViNormal { - pending_cmd: ViCmd, + pending_seq: String, } impl ViNormal { pub fn new() -> Self { Self::default() } - pub fn take_cmd(&mut self) -> ViCmd { - std::mem::take(&mut self.pending_cmd) - } pub fn clear_cmd(&mut self) { - self.pending_cmd = ViCmd::new(); + self.pending_seq = String::new(); } - fn handle_pending_builder(&mut self, key: E) -> Option { - if self.pending_cmd.wants_register { - if let E(K::Char(ch @ ('a'..='z' | 'A'..='Z')), M::NONE) = key { - self.pending_cmd.set_register(ch); - return None - } else { - self.clear_cmd(); - return None - } - } else if let Some(Verb::Builder(_)) = &self.pending_cmd.verb { - todo!() // Don't have any verb builders yet, but might later - } else if let Some(Motion::Builder(builder)) = self.pending_cmd.motion.clone() { - match builder { - MotionBuilder::CharSearch(direction, dest, _) => { - if let E(K::Char(ch), M::NONE) = key { - self.pending_cmd.set_motion(Motion::CharSearch( - direction.unwrap(), - dest.unwrap(), - ch.into(), - )); - return Some(self.take_cmd()); - } else { - self.clear_cmd(); - return None; - } - } - MotionBuilder::TextObj(_, bound) => { - if let Some(bound) = bound { - if let E(K::Char(ch), M::NONE) = key { - let obj = match ch { - 'w' => TextObj::Word(Word::Normal), - 'W' => TextObj::Word(Word::Big), - '(' | ')' => TextObj::Paren, - '[' | ']' => TextObj::Bracket, - '{' | '}' => TextObj::Brace, - '<' | '>' => TextObj::Angle, - '"' => TextObj::DoubleQuote, - '\'' => TextObj::SingleQuote, - '`' => TextObj::BacktickQuote, - _ => TextObj::Custom(ch), - }; - self.pending_cmd.set_motion(Motion::TextObj(obj, bound)); - return Some(self.take_cmd()); - } else { - self.clear_cmd(); - return None; - } - } else if let E(K::Char(ch), M::NONE) = key { - let bound = match ch { - 'i' => Bound::Inside, - 'a' => Bound::Around, - _ => { - self.clear_cmd(); - return None; - } - }; - self.pending_cmd.set_motion(Motion::Builder(MotionBuilder::TextObj(None, Some(bound)))); - return None; - } else { - self.clear_cmd(); - return None; - } - } + pub fn take_cmd(&mut self) -> String { + std::mem::take(&mut self.pending_seq) + } + fn validate_combination(&self, verb: Option<&Verb>, motion: Option<&Motion>) -> CmdState { + if verb.is_none() { + match motion { + Some(Motion::TextObj(_,_)) => return CmdState::Invalid, + Some(_) => return CmdState::Complete, + None => return CmdState::Pending } } + if verb.is_some() && motion.is_none() { + match verb.unwrap() { + Verb::Put(_) | + Verb::DeleteChar(_) => CmdState::Complete, + _ => CmdState::Pending + } + } else { + CmdState::Complete + } + } + pub fn parse_count(&self, chars: &mut Peekable>) -> Option { + let mut count = String::new(); + let Some(_digit @ '1'..='9') = chars.peek() else { + return None + }; + count.push(chars.next().unwrap()); + while let Some(_digit @ '0'..='9') = chars.peek() { + count.push(chars.next().unwrap()); + } + if !count.is_empty() { + count.parse::().ok() + } else { + None + } + } + /// End the parse and clear the pending sequence + pub fn quit_parse(&mut self) -> Option { + flog!(WARN, "exiting parse early with sequence: {}",self.pending_seq); + self.clear_cmd(); None } + pub fn try_parse(&mut self, ch: char) -> Option { + self.pending_seq.push(ch); + flog!(DEBUG, self.pending_seq); + let mut chars = self.pending_seq.chars().peekable(); + + let register = 'reg_parse: { + let mut chars_clone = chars.clone(); + let count = self.parse_count(&mut chars_clone); + + let Some('"') = chars_clone.next() else { + break 'reg_parse RegisterName::default() + }; + + let Some(reg_name) = chars_clone.next() else { + return None // Pending register name + }; + match reg_name { + 'a'..='z' | + 'A'..='Z' => { /* proceed */ } + _ => return self.quit_parse() + } + + chars = chars_clone; + RegisterName::new(Some(reg_name), count) + }; + + let verb = 'verb_parse: { + let mut chars_clone = chars.clone(); + let count = self.parse_count(&mut chars_clone).unwrap_or(1); + + let Some(ch) = chars_clone.next() else { + break 'verb_parse None + }; + flog!(DEBUG, "parsing verb char '{}'",ch); + match ch { + '.' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::RepeatLast)), + motion: None, + raw_seq: self.take_cmd(), + } + ) + } + 'x' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::DeleteChar(Anchor::After))); + } + 'X' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::DeleteChar(Anchor::Before))); + } + 'p' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::Put(Anchor::After))); + } + 'P' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::Put(Anchor::Before))); + } + 'r' => { + let Some(ch) = chars_clone.next() else { + return None + }; + return Some( + ViCmd { + register, + verb: Some(VerbCmd(1, Verb::ReplaceChar(ch))), + motion: Some(MotionCmd(count, Motion::ForwardChar)), + raw_seq: self.take_cmd() + } + ) + } + 'u' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::Undo)), + motion: None, + raw_seq: self.take_cmd() + } + ) + } + 'o' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::InsertModeLineBreak(Anchor::After))), + motion: None, + raw_seq: self.take_cmd() + } + ) + } + 'O' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::InsertModeLineBreak(Anchor::Before))), + motion: None, + raw_seq: self.take_cmd() + } + ) + } + 'a' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::InsertMode)), + motion: Some(MotionCmd(1, Motion::ForwardChar)), + raw_seq: self.take_cmd() + } + ) + } + 'A' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::InsertMode)), + motion: Some(MotionCmd(1, Motion::EndOfLine)), + raw_seq: self.take_cmd() + } + ) + } + 'i' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::InsertMode)), + motion: None, + raw_seq: self.take_cmd() + } + ) + } + 'I' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::InsertMode)), + motion: Some(MotionCmd(1, Motion::BeginningOfFirstWord)), + raw_seq: self.take_cmd() + } + ) + } + 'y' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::Yank)) + } + 'd' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::Delete)) + } + 'c' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::Change)) + } + '=' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::Equalize)) + } + _ => break 'verb_parse None + } + }; + + let motion = 'motion_parse: { + let mut chars_clone = chars.clone(); + let count = self.parse_count(&mut chars_clone).unwrap_or(1); + + let Some(ch) = chars_clone.next() else { + break 'motion_parse None + }; + flog!(DEBUG, "parsing motion char '{}'",ch); + match (ch, &verb) { + ('d', Some(VerbCmd(_,Verb::Delete))) | + ('c', Some(VerbCmd(_,Verb::Change))) | + ('y', Some(VerbCmd(_,Verb::Yank))) | + ('>', Some(VerbCmd(_,Verb::Indent))) | + ('<', Some(VerbCmd(_,Verb::Dedent))) => break 'motion_parse Some(MotionCmd(count, Motion::WholeLine)), + _ => {} + } + match ch { + 'g' => { + if let Some(ch) = chars_clone.peek() { + match ch { + 'g' => { + chars_clone.next(); + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::BeginningOfBuffer)) + } + 'e' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::BackwardWord(To::End, Word::Normal))); + } + 'E' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::BackwardWord(To::End, Word::Big))); + } + _ => return self.quit_parse() + } + } else { + break 'motion_parse None + } + } + '|' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(1, Motion::ToColumn(count))); + } + '0' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::BeginningOfLine)); + } + '$' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::EndOfLine)); + } + 'k' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::LineUp)); + } + 'j' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::LineDown)); + } + 'h' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::BackwardChar)); + } + 'l' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::ForwardChar)); + } + 'w' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::ForwardWord(To::Start, Word::Normal))); + } + 'W' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::ForwardWord(To::Start, Word::Big))); + } + 'e' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::ForwardWord(To::End, Word::Normal))); + } + 'E' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::ForwardWord(To::End, Word::Big))); + } + 'b' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::BackwardWord(To::Start, Word::Normal))); + } + 'B' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::BackwardWord(To::Start, Word::Big))); + } + ch if ch == 'i' || ch == 'a' => { + let bound = match ch { + 'i' => Bound::Inside, + 'a' => Bound::Around, + _ => unreachable!() + }; + if chars_clone.peek().is_none() { + break 'motion_parse None + } + let obj = match chars_clone.next().unwrap() { + 'w' => TextObj::Word(Word::Normal), + 'W' => TextObj::Word(Word::Big), + '"' => TextObj::DoubleQuote, + '\'' => TextObj::SingleQuote, + '(' | ')' | 'b' => TextObj::Paren, + '{' | '}' | 'B' => TextObj::Brace, + '[' | ']' => TextObj::Bracket, + '<' | '>' => TextObj::Angle, + _ => return self.quit_parse() + }; + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::TextObj(obj, bound))) + } + _ => return self.quit_parse(), + } + }; + + if chars.peek().is_some() { + flog!(WARN, "Unused characters in Vi command parse!"); + flog!(WARN, "{:?}",chars) + } + + let verb_ref = verb.as_ref().map(|v| &v.1); + let motion_ref = motion.as_ref().map(|m| &m.1); + + match self.validate_combination(verb_ref, motion_ref) { + CmdState::Complete => { + let cmd = Some( + ViCmd { + register, + verb, + motion, + raw_seq: std::mem::take(&mut self.pending_seq) + } + ); + flog!(DEBUG, cmd); + cmd + } + CmdState::Pending => { + flog!(DEBUG, "pending sequence: {}", self.pending_seq); + None + } + CmdState::Invalid => { + flog!(DEBUG, "invalid sequence: {}",self.pending_seq); + self.pending_seq.clear(); + None + } + } + } } impl ViMode for ViNormal { fn handle_key(&mut self, key: E) -> Option { - if let E(K::Char(ch),M::NONE) = key { - self.pending_cmd.append_seq_char(ch); - } - if self.pending_cmd.is_building() { - return self.handle_pending_builder(key) - } + flog!(DEBUG, key); match key { - E(K::Char(digit @ '0'..='9'), M::NONE) => self.pending_cmd.append_digit(digit), - E(K::Char('"'),M::NONE) => { - if self.pending_cmd.is_empty() { - if self.pending_cmd.register().name().is_none() { - self.pending_cmd.wants_register = true; - } else { - self.clear_cmd(); + E(K::Char(ch), M::NONE) => self.try_parse(ch), + E(K::Char('R'), M::CTRL) => { + let mut chars = self.pending_seq.chars().peekable(); + let count = self.parse_count(&mut chars).unwrap_or(1); + Some( + ViCmd { + register: RegisterName::default(), + verb: Some(VerbCmd(count,Verb::Redo)), + motion: None, + raw_seq: self.take_cmd() } - } else { + ) + } + E(K::Esc, M::NONE) => { + self.clear_cmd(); + None + } + _ => { + if let Some(cmd) = common_cmds(key) { self.clear_cmd(); - } - return None - } - E(K::Char('i'),M::NONE) if self.pending_cmd.verb().is_some() => { - self.pending_cmd.set_motion(Motion::Builder(MotionBuilder::TextObj(None, Some(Bound::Inside)))); - } - E(K::Char('a'),M::NONE) if self.pending_cmd.verb().is_some() => { - self.pending_cmd.set_motion(Motion::Builder(MotionBuilder::TextObj(None, Some(Bound::Around)))); - } - E(K::Char('h'),M::NONE) => self.pending_cmd.set_motion(Motion::BackwardChar), - E(K::Char('j'),M::NONE) => self.pending_cmd.set_motion(Motion::LineDown), - E(K::Char('k'),M::NONE) => self.pending_cmd.set_motion(Motion::LineUp), - E(K::Char('l'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardChar), - E(K::Char('w'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardWord(To::Start, Word::Normal)), - E(K::Char('W'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardWord(To::Start, Word::Big)), - E(K::Char('e'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardWord(To::End, Word::Normal)), - E(K::Char('E'),M::NONE) => self.pending_cmd.set_motion(Motion::ForwardWord(To::End, Word::Big)), - E(K::Char('b'),M::NONE) => self.pending_cmd.set_motion(Motion::BackwardWord(Word::Normal)), - E(K::Char('B'),M::NONE) => self.pending_cmd.set_motion(Motion::BackwardWord(Word::Big)), - E(K::Char('x'),M::NONE) => self.pending_cmd.set_verb(Verb::DeleteChar(Anchor::After)), - E(K::Char('X'),M::NONE) => self.pending_cmd.set_verb(Verb::DeleteChar(Anchor::Before)), - E(K::Char('d'),M::NONE) => { - if self.pending_cmd.verb().is_none() { - self.pending_cmd.set_verb(Verb::Delete) - } else if let Some(verb) = self.pending_cmd.verb() { - if verb == &Verb::Delete { - self.pending_cmd.set_motion(Motion::WholeLine); - } else { - self.clear_cmd(); - } + Some(cmd) + } else { + None } } - E(K::Char('c'),M::NONE) => { - if self.pending_cmd.verb().is_none() { - self.pending_cmd.set_verb(Verb::Change) - } else if let Some(verb) = self.pending_cmd.verb() { - if verb == &Verb::Change { - self.pending_cmd.set_motion(Motion::WholeLine); - } else { - self.clear_cmd(); - } - } - } - E(K::Char('y'),M::NONE) => { - if self.pending_cmd.verb().is_none() { - self.pending_cmd.set_verb(Verb::Yank) - } else if let Some(verb) = self.pending_cmd.verb() { - if verb == &Verb::Yank { - self.pending_cmd.set_motion(Motion::WholeLine); - } else { - self.clear_cmd(); - } - } - } - E(K::Char('p'),M::NONE) => self.pending_cmd.set_verb(Verb::Put(Anchor::After)), - E(K::Char('P'),M::NONE) => self.pending_cmd.set_verb(Verb::Put(Anchor::Before)), - E(K::Char('D'),M::NONE) => { - self.pending_cmd.set_verb(Verb::Delete); - self.pending_cmd.set_motion(Motion::EndOfLine); - } - E(K::Char('f'),M::NONE) => { - let builder = MotionBuilder::CharSearch( - Some(Direction::Forward), - Some(Dest::On), - None - ); - self.pending_cmd.set_motion(Motion::Builder(builder)); - } - E(K::Char('F'),M::NONE) => { - let builder = MotionBuilder::CharSearch( - Some(Direction::Backward), - Some(Dest::On), - None - ); - self.pending_cmd.set_motion(Motion::Builder(builder)); - } - E(K::Char('t'),M::NONE) => { - let builder = MotionBuilder::CharSearch( - Some(Direction::Forward), - Some(Dest::Before), - None - ); - self.pending_cmd.set_motion(Motion::Builder(builder)); - } - E(K::Char('T'),M::NONE) => { - let builder = MotionBuilder::CharSearch( - Some(Direction::Backward), - Some(Dest::Before), - None - ); - self.pending_cmd.set_motion(Motion::Builder(builder)); - } - E(K::Char('i'),M::NONE) => { - self.pending_cmd.set_verb(Verb::InsertMode); - } - E(K::Char('I'),M::NONE) => { - self.pending_cmd.set_verb(Verb::InsertMode); - self.pending_cmd.set_motion(Motion::BeginningOfFirstWord); - } - E(K::Char('a'),M::NONE) => { - self.pending_cmd.set_verb(Verb::InsertMode); - self.pending_cmd.set_motion(Motion::ForwardChar); - } - E(K::Char('A'),M::NONE) => { - self.pending_cmd.set_verb(Verb::InsertMode); - self.pending_cmd.set_motion(Motion::EndOfLine); - } - _ => return common_cmds(key) - } - if self.pending_cmd.is_complete() { - Some(self.take_cmd()) - } else { - None } } @@ -332,28 +539,26 @@ impl ViMode for ViNormal { fn cursor_style(&self) -> String { "\x1b[2 q".to_string() } + + fn pending_seq(&self) -> Option { + Some(self.pending_seq.clone()) + } } pub fn common_cmds(key: E) -> Option { let mut pending_cmd = ViCmd::new(); match key { - E(K::Home, M::NONE) => pending_cmd.set_motion(Motion::BeginningOfLine), - E(K::End, M::NONE) => pending_cmd.set_motion(Motion::EndOfLine), - E(K::Left, M::NONE) => pending_cmd.set_motion(Motion::BackwardChar), - E(K::Right, M::NONE) => pending_cmd.set_motion(Motion::ForwardChar), - E(K::Up, M::NONE) => pending_cmd.set_motion(Motion::LineUp), - E(K::Down, M::NONE) => pending_cmd.set_motion(Motion::LineDown), - E(K::Enter, M::NONE) => pending_cmd.set_verb(Verb::AcceptLine), - E(K::Char('D'), M::CTRL) => pending_cmd.set_verb(Verb::EndOfFile), + E(K::Home, M::NONE) => pending_cmd.set_motion(MotionCmd(1,Motion::BeginningOfLine)), + E(K::End, M::NONE) => pending_cmd.set_motion(MotionCmd(1,Motion::EndOfLine)), + E(K::Left, M::NONE) => pending_cmd.set_motion(MotionCmd(1,Motion::BackwardChar)), + E(K::Right, M::NONE) => pending_cmd.set_motion(MotionCmd(1,Motion::ForwardChar)), + E(K::Up, M::NONE) => pending_cmd.set_motion(MotionCmd(1,Motion::LineUp)), + E(K::Down, M::NONE) => pending_cmd.set_motion(MotionCmd(1,Motion::LineDown)), + E(K::Enter, M::NONE) => pending_cmd.set_verb(VerbCmd(1,Verb::AcceptLine)), + E(K::Char('D'), M::CTRL) => pending_cmd.set_verb(VerbCmd(1,Verb::EndOfFile)), + E(K::Delete, M::NONE) => pending_cmd.set_verb(VerbCmd(1,Verb::DeleteChar(Anchor::After))), E(K::Backspace, M::NONE) | - E(K::Char('H'), M::CTRL) => { - pending_cmd.set_verb(Verb::Delete); - pending_cmd.set_motion(Motion::BackwardChar); - } - E(K::Delete, M::NONE) => { - pending_cmd.set_verb(Verb::Delete); - pending_cmd.set_motion(Motion::ForwardChar); - } + E(K::Char('H'), M::CTRL) => pending_cmd.set_verb(VerbCmd(1,Verb::DeleteChar(Anchor::Before))), _ => return None } Some(pending_cmd) diff --git a/src/prompt/readline/term.rs b/src/prompt/readline/term.rs index 7780e56..67bf0d8 100644 --- a/src/prompt/readline/term.rs +++ b/src/prompt/readline/term.rs @@ -1,5 +1,10 @@ use std::{os::fd::{BorrowedFd, RawFd}, thread::sleep, time::{Duration, Instant}}; -use nix::{errno::Errno, fcntl::{fcntl, FcntlArg, OFlag}, libc::STDIN_FILENO, sys::termios, unistd::{isatty, read, write}}; +use nix::{errno::Errno, fcntl::{fcntl, FcntlArg, OFlag}, libc::{self, STDIN_FILENO}, sys::termios, unistd::{isatty, read, write}}; +use nix::libc::{winsize, TIOCGWINSZ}; +use std::mem::zeroed; +use std::io; + +use crate::libsh::error::ShResult; use super::keys::{KeyCode, KeyEvent, ModKeys}; @@ -32,6 +37,34 @@ impl Terminal { .expect("Failed to restore terminal settings"); } + + pub fn get_dimensions(&self) -> ShResult<(usize, usize)> { + if !isatty(self.stdin).unwrap_or(false) { + return Err(io::Error::new(io::ErrorKind::Other, "Not a TTY"))?; + } + + let mut ws: winsize = unsafe { zeroed() }; + + let res = unsafe { libc::ioctl(self.stdin, TIOCGWINSZ, &mut ws) }; + if res == -1 { + return Err(io::Error::last_os_error())?; + } + + Ok((ws.ws_row as usize, ws.ws_col as usize)) + } + + pub fn save_cursor_pos(&self) { + self.write("\x1b[s") + } + + pub fn restore_cursor_pos(&self) { + self.write("\x1b[u") + } + + pub fn move_cursor_to(&self, (row,col): (usize,usize)) { + self.write(&format!("\x1b[{row};{col}H",)) + } + pub fn with_raw_mode R, R>(func: F) -> R { let saved = Self::raw_mode(); let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(func)); @@ -48,6 +81,29 @@ impl Terminal { }) } + fn read_blocks_then_read(&self, buf: &mut [u8], timeout: Duration) -> Option { + Self::with_raw_mode(|| { + self.read_blocks(false); + let start = Instant::now(); + loop { + match read(self.stdin, buf) { + Ok(n) if n > 0 => { + self.read_blocks(true); + return Some(n); + } + Ok(_) => {} + Err(e) if e == Errno::EAGAIN => {} + Err(_) => return None, + } + if start.elapsed() > timeout { + self.read_blocks(true); + return None; + } + sleep(Duration::from_millis(1)); + } + }) + } + /// Same as read_byte(), only non-blocking with a very short timeout pub fn peek_byte(&self, buf: &mut [u8]) -> usize { const TIMEOUT_DUR: Duration = Duration::from_millis(50); diff --git a/src/prompt/readline/vicmd.rs b/src/prompt/readline/vicmd.rs index e1d1e3f..26147fe 100644 --- a/src/prompt/readline/vicmd.rs +++ b/src/prompt/readline/vicmd.rs @@ -1,18 +1,35 @@ use super::{linebuf::{TermChar, TermCharBuf}, register::{append_register, read_register, write_register}}; -#[derive(Clone,Copy,Default,Debug)] +#[derive(Clone,Copy,Debug)] pub struct RegisterName { name: Option, + count: usize, append: bool } impl RegisterName { + pub fn new(name: Option, count: Option) -> Self { + let Some(ch) = name else { + return Self::default() + }; + + let append = ch.is_uppercase(); + let name = ch.to_ascii_lowercase(); + Self { + name: Some(name), + count: count.unwrap_or(1), + append + } + } pub fn name(&self) -> Option { self.name } pub fn is_append(&self) -> bool { self.append } + pub fn count(&self) -> usize { + self.count + } pub fn write_to_register(&self, buf: TermCharBuf) { if self.append { append_register(self.name, buf); @@ -25,29 +42,21 @@ impl RegisterName { } } +impl Default for RegisterName { + fn default() -> Self { + Self { + name: None, + count: 1, + append: false + } + } +} + #[derive(Clone,Default,Debug)] pub struct ViCmd { - pub wants_register: bool, // Waiting for register character - - /// Register to read from/write to - pub register_count: Option, pub register: RegisterName, - - /// Verb to perform - pub verb_count: Option, - pub verb: Option, - - /// Motion to perform - pub motion_count: Option, - pub motion: Option, - - /// Count digits are held here until we know what we are counting - /// Once a register/verb/motion is set, the count is taken from here - pub pending_count: Option, - - /// The actual keys the user typed for this command - /// Maybe display this somewhere around the prompt later? - /// Prompt escape sequence maybe? + pub verb: Option, + pub motion: Option, pub raw_seq: String, } @@ -55,79 +64,54 @@ impl ViCmd { pub fn new() -> Self { Self::default() } - pub fn set_register(&mut self, register: char) { - let append = register.is_uppercase(); - let name = Some(register.to_ascii_lowercase()); - let reg_name = RegisterName { name, append }; - self.register = reg_name; - self.register_count = self.pending_count.take(); - self.wants_register = false; + pub fn set_motion(&mut self, motion: MotionCmd) { + self.motion = Some(motion) } - pub fn append_seq_char(&mut self, ch: char) { - self.raw_seq.push(ch) + pub fn set_verb(&mut self, verb: VerbCmd) { + self.verb = Some(verb) } - pub fn is_empty(&self) -> bool { - !self.wants_register && - self.register.name.is_none() && - self.verb_count.is_none() && - self.verb.is_none() && - self.motion_count.is_none() && - self.motion.is_none() - } - pub fn set_verb(&mut self, verb: Verb) { - self.verb = Some(verb); - self.verb_count = self.pending_count.take(); - } - pub fn set_motion(&mut self, motion: Motion) { - self.motion = Some(motion); - self.motion_count = self.pending_count.take(); - } - pub fn register(&self) -> RegisterName { - self.register - } - pub fn verb(&self) -> Option<&Verb> { + pub fn verb(&self) -> Option<&VerbCmd> { self.verb.as_ref() } - pub fn verb_count(&self) -> u16 { - self.verb_count.unwrap_or(1) - } - pub fn motion(&self) -> Option<&Motion> { + pub fn motion(&self) -> Option<&MotionCmd> { self.motion.as_ref() } - pub fn motion_count(&self) -> u16 { - self.motion_count.unwrap_or(1) + pub fn verb_count(&self) -> usize { + self.verb.as_ref().map(|v| v.0).unwrap_or(1) } - pub fn append_digit(&mut self, digit: char) { - // Convert char digit to a number (assuming ASCII '0'..'9') - let digit_val = digit.to_digit(10).expect("digit must be 0-9") as u16; - self.pending_count = Some(match self.pending_count { - Some(count) => count * 10 + digit_val, - None => digit_val, - }); + pub fn motion_count(&self) -> usize { + self.motion.as_ref().map(|m| m.0).unwrap_or(1) } - pub fn is_building(&self) -> bool { - matches!(self.verb, Some(Verb::Builder(_))) || - matches!(self.motion, Some(Motion::Builder(_))) || - self.wants_register + pub fn is_cmd_repeat(&self) -> bool { + self.verb.as_ref().is_some_and(|v| matches!(v.1,Verb::RepeatLast)) } - pub fn is_complete(&self) -> bool { - !( - (self.verb.is_none() && self.motion.is_none()) || - (self.verb.is_none() && self.motion.as_ref().is_some_and(|m| m.needs_verb())) || - (self.motion.is_none() && self.verb.as_ref().is_some_and(|v| v.needs_motion())) || - self.is_building() - ) + pub fn is_motion_repeat(&self) -> bool { + self.verb.as_ref().is_some_and(|v| matches!(v.1,Verb::RepeatMotion | Verb::RepeatMotionRev)) } pub fn should_submit(&self) -> bool { - self.verb.as_ref().is_some_and(|v| *v == Verb::AcceptLine) + self.verb.as_ref().is_some_and(|v| matches!(v.1, Verb::AcceptLine)) + } + pub fn is_undo_op(&self) -> bool { + self.verb.as_ref().is_some_and(|v| matches!(v.1, Verb::Undo | Verb::Redo)) } pub fn is_mode_transition(&self) -> bool { self.verb.as_ref().is_some_and(|v| { - matches!(*v, Verb::InsertMode | Verb::NormalMode | Verb::OverwriteMode | Verb::VisualMode) + matches!(v.1, + Verb::InsertMode | + Verb::InsertModeLineBreak(_) | + Verb::NormalMode | + Verb::VisualMode | + Verb::OverwriteMode + ) }) } } +#[derive(Clone,Debug)] +pub struct VerbCmd(pub usize,pub Verb); +#[derive(Clone,Debug)] +pub struct MotionCmd(pub usize,pub Motion); + #[derive(Debug, Clone, Eq, PartialEq)] #[non_exhaustive] pub enum Verb { @@ -141,10 +125,14 @@ pub enum Verb { Complete, CompleteBackward, Undo, + Redo, RepeatLast, + RepeatMotion, + RepeatMotionRev, Put(Anchor), OverwriteMode, InsertMode, + InsertModeLineBreak(Anchor), NormalMode, VisualMode, JoinLines, @@ -153,6 +141,7 @@ pub enum Verb { Breakline(Anchor), Indent, Dedent, + Equalize, AcceptLine, Builder(VerbBuilder), EndOfFile @@ -172,6 +161,28 @@ impl Verb { Self::Yank ) } + pub fn is_edit(&self) -> bool { + matches!(self, + Self::Delete | + Self::DeleteChar(_) | + Self::Change | + Self::ReplaceChar(_) | + Self::Substitute | + Self::ToggleCase | + Self::RepeatLast | + Self::Put(_) | + Self::OverwriteMode | + Self::InsertModeLineBreak(_) | + Self::JoinLines | + Self::InsertChar(_) | + Self::Insert(_) | + Self::Breakline(_) | + Self::EndOfFile + ) + } + pub fn is_char_insert(&self) -> bool { + matches!(self, Self::InsertChar(_)) + } } #[derive(Debug, Clone, Eq, PartialEq)] @@ -185,7 +196,7 @@ pub enum Motion { /// end-of-line EndOfLine, /// backward-word, vi-prev-word - BackwardWord(Word), // Backward until start of word + BackwardWord(To, Word), // Backward until start of word /// forward-word, vi-end-word, vi-next-word ForwardWord(To, Word), // Forward until start/end of word /// character-search, character-search-backward, vi-char-search @@ -204,6 +215,8 @@ pub enum Motion { BeginningOfBuffer, /// end-of-register EndOfBuffer, + ToColumn(usize), + Range(usize,usize), Builder(MotionBuilder), Null } From c0eff4a9a35e55763733874b904ad6863c5360fe Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Fri, 23 May 2025 09:47:05 -0400 Subject: [PATCH 12/19] implemented verb and motion repetition --- src/prompt/readline/linebuf.rs | 6 +---- src/prompt/readline/mod.rs | 47 ++++++++++++++++++++++++++-------- src/prompt/readline/mode.rs | 36 ++++++++++++++++++++++++++ src/prompt/readline/vicmd.rs | 45 +++++++++++++++++++++++++++++--- 4 files changed, 115 insertions(+), 19 deletions(-) diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index 48ef3a4..2bdf644 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -908,7 +908,7 @@ impl LineBuf { Motion::BeginningOfBuffer => MotionKind::To(0), Motion::EndOfBuffer => MotionKind::To(self.buffer.len().saturating_sub(1)), Motion::Null => MotionKind::Null, - Motion::Builder(_) => unreachable!(), + _ => unreachable!(), } } pub fn exec_verb(&mut self, verb: Verb, motion: MotionKind, register: RegisterName) -> ShResult<()> { @@ -1100,12 +1100,8 @@ impl LineBuf { self.undo_stack.push(diff); return }; - dbg!("old"); - dbg!(&edit); edit.new.append(&mut diff.new); - dbg!("new"); - dbg!(&edit); self.undo_stack.push(edit); } else { diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 56d65ea..35a11b1 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -4,7 +4,7 @@ use linebuf::{strip_ansi_codes_and_escapes, LineBuf, TermCharBuf}; use mode::{CmdReplay, ViInsert, ViMode, ViNormal}; use term::Terminal; use unicode_width::UnicodeWidthStr; -use vicmd::{MotionCmd, RegisterName, Verb, VerbCmd, ViCmd}; +use vicmd::{Motion, MotionCmd, RegisterName, Verb, VerbCmd, ViCmd}; use crate::libsh::{error::{ShErr, ShErrKind, ShResult}, term::{Style, Styled}}; use crate::prelude::*; @@ -142,11 +142,12 @@ impl FernVi { if mode.is_repeatable() { self.last_action = mode.as_replay(); } + return self.line.exec_cmd(cmd); } else if cmd.is_cmd_repeat() { let Some(replay) = self.last_action.clone() else { return Ok(()) }; - let ViCmd { register, verb, motion, raw_seq } = cmd; + let ViCmd { verb, .. } = cmd; let VerbCmd(count,_) = verb.unwrap(); match replay { CmdReplay::ModeReplay { cmds, mut repeat } => { @@ -164,8 +165,12 @@ impl FernVi { if count > 1 { // Override the counts with the one passed to the '.' command if cmd.verb.is_some() { - cmd.verb.as_mut().map(|v| v.0 = count); - cmd.motion.as_mut().map(|m| m.0 = 0); + if let Some(v_mut) = cmd.verb.as_mut() { + v_mut.0 = count + } + if let Some(m_mut) = cmd.motion.as_mut() { + m_mut.0 = 0 + } } else { return Ok(()) // it has to have a verb to be repeatable, something weird happened } @@ -176,8 +181,8 @@ impl FernVi { } return Ok(()) } else if cmd.is_motion_repeat() { - match cmd.verb.as_ref().unwrap().1 { - Verb::RepeatMotion => { + match cmd.motion.as_ref().unwrap() { + MotionCmd(count,Motion::RepeatMotion) => { let Some(motion) = self.last_movement.clone() else { return Ok(()) }; @@ -185,15 +190,35 @@ impl FernVi { register: RegisterName::default(), verb: None, motion: Some(motion), - raw_seq: ";".into() + raw_seq: format!("{count};") }; - self.line.exec_cmd(repeat_cmd)?; + return self.line.exec_cmd(repeat_cmd); + } + MotionCmd(count,Motion::RepeatMotionRev) => { + let Some(motion) = self.last_movement.clone() else { + return Ok(()) + }; + let mut new_motion = motion.invert_char_motion(); + new_motion.0 = *count; + let repeat_cmd = ViCmd { + register: RegisterName::default(), + verb: None, + motion: Some(new_motion), + raw_seq: format!("{count},") + }; + return self.line.exec_cmd(repeat_cmd); } - Verb::RepeatMotionRev => {} _ => unreachable!() } } - self.line.exec_cmd(cmd.clone())?; - Ok(()) + + if cmd.is_repeatable() { + self.last_action = Some(CmdReplay::Single(cmd.clone())); + } + if cmd.is_char_search() { + self.last_movement = cmd.motion.clone() + } + + self.line.exec_cmd(cmd.clone()) } } diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs index 72b2632..35806aa 100644 --- a/src/prompt/readline/mode.rs +++ b/src/prompt/readline/mode.rs @@ -383,6 +383,42 @@ impl ViNormal { break 'motion_parse None } } + 'f' => { + let Some(ch) = chars_clone.peek() else { + break 'motion_parse None + }; + + break 'motion_parse Some(MotionCmd(count, Motion::CharSearch(Direction::Forward, Dest::On, (*ch).into()))) + } + 'F' => { + let Some(ch) = chars_clone.peek() else { + break 'motion_parse None + }; + + break 'motion_parse Some(MotionCmd(count, Motion::CharSearch(Direction::Backward, Dest::On, (*ch).into()))) + } + 't' => { + let Some(ch) = chars_clone.peek() else { + break 'motion_parse None + }; + + break 'motion_parse Some(MotionCmd(count, Motion::CharSearch(Direction::Forward, Dest::Before, (*ch).into()))) + } + 'T' => { + let Some(ch) = chars_clone.peek() else { + break 'motion_parse None + }; + + break 'motion_parse Some(MotionCmd(count, Motion::CharSearch(Direction::Backward, Dest::Before, (*ch).into()))) + } + ';' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::RepeatMotion)); + } + ',' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::RepeatMotionRev)); + } '|' => { chars = chars_clone; break 'motion_parse Some(MotionCmd(1, Motion::ToColumn(count))); diff --git a/src/prompt/readline/vicmd.rs b/src/prompt/readline/vicmd.rs index 26147fe..f117ec3 100644 --- a/src/prompt/readline/vicmd.rs +++ b/src/prompt/readline/vicmd.rs @@ -82,11 +82,17 @@ impl ViCmd { pub fn motion_count(&self) -> usize { self.motion.as_ref().map(|m| m.0).unwrap_or(1) } + pub fn is_repeatable(&self) -> bool { + self.verb.as_ref().is_some_and(|v| v.1.is_repeatable()) + } pub fn is_cmd_repeat(&self) -> bool { self.verb.as_ref().is_some_and(|v| matches!(v.1,Verb::RepeatLast)) } pub fn is_motion_repeat(&self) -> bool { - self.verb.as_ref().is_some_and(|v| matches!(v.1,Verb::RepeatMotion | Verb::RepeatMotionRev)) + self.motion.as_ref().is_some_and(|m| matches!(m.1,Motion::RepeatMotion | Motion::RepeatMotionRev)) + } + pub fn is_char_search(&self) -> bool { + self.motion.as_ref().is_some_and(|m| matches!(m.1, Motion::CharSearch(..))) } pub fn should_submit(&self) -> bool { self.verb.as_ref().is_some_and(|v| matches!(v.1, Verb::AcceptLine)) @@ -112,6 +118,19 @@ pub struct VerbCmd(pub usize,pub Verb); #[derive(Clone,Debug)] pub struct MotionCmd(pub usize,pub Motion); +impl MotionCmd { + pub fn invert_char_motion(self) -> Self { + let MotionCmd(count,Motion::CharSearch(dir, dest, ch)) = self else { + unreachable!() + }; + let new_dir = match dir { + Direction::Forward => Direction::Backward, + Direction::Backward => Direction::Forward, + }; + MotionCmd(count,Motion::CharSearch(new_dir, dest, ch)) + } +} + #[derive(Debug, Clone, Eq, PartialEq)] #[non_exhaustive] pub enum Verb { @@ -127,8 +146,6 @@ pub enum Verb { Undo, Redo, RepeatLast, - RepeatMotion, - RepeatMotionRev, Put(Anchor), OverwriteMode, InsertMode, @@ -161,6 +178,26 @@ impl Verb { Self::Yank ) } + pub fn is_repeatable(&self) -> bool { + matches!(self, + Self::Delete | + Self::DeleteChar(_) | + Self::Change | + Self::ReplaceChar(_) | + Self::Substitute | + Self::ToggleCase | + Self::Put(_) | + Self::OverwriteMode | + Self::InsertModeLineBreak(_) | + Self::JoinLines | + Self::InsertChar(_) | + Self::Insert(_) | + Self::Breakline(_) | + Self::Indent | + Self::Dedent | + Self::Equalize + ) + } pub fn is_edit(&self) -> bool { matches!(self, Self::Delete | @@ -218,6 +255,8 @@ pub enum Motion { ToColumn(usize), Range(usize,usize), Builder(MotionBuilder), + RepeatMotion, + RepeatMotionRev, Null } From 45b7a16cae2a9a6217f661bd310dfdde08a6e499 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Fri, 23 May 2025 10:27:11 -0400 Subject: [PATCH 13/19] about to refactor the line buffer --- src/prompt/readline/linebuf.rs | 83 ++++++++++++++++++++++++++++++---- src/prompt/readline/mod.rs | 8 +++- 2 files changed, 82 insertions(+), 9 deletions(-) diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index 2bdf644..0fae256 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -1,4 +1,4 @@ -use std::{fmt::Display, ops::{Deref, DerefMut, Range, RangeBounds, RangeInclusive}, sync::Arc}; +use std::{cmp::Ordering, fmt::Display, ops::{Deref, DerefMut, Range, RangeBounds, RangeInclusive}, sync::Arc}; use unicode_width::UnicodeWidthStr; @@ -19,7 +19,13 @@ pub enum MotionKind { To(usize), Backward(usize), Range(Range), - Null + Line(isize), // positive = up line, negative = down line + ToLine(usize), + Null, + + /// Absolute position based on display width of characters + /// Factors in the length of the prompt, and skips newlines + ToScreenPos(usize), } impl MotionKind { @@ -244,6 +250,7 @@ pub struct LineBuf { buffer: TermCharBuf, cursor: usize, clamp_cursor: bool, + first_line_offset: usize, merge_edit: bool, undo_stack: Vec, redo_stack: Vec, @@ -261,6 +268,9 @@ impl LineBuf { } self } + pub fn set_first_line_offset(&mut self, offset: usize) { + self.first_line_offset = offset + } pub fn set_cursor_clamp(&mut self, yn: bool) { self.clamp_cursor = yn } @@ -790,10 +800,30 @@ impl LineBuf { pub fn validate_range(&self, range: &Range) -> bool { range.end < self.buffer.len() } - pub fn cur_line_range(&self) -> RangeInclusive { - let cursor = self.cursor(); - let mut line_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); - let mut line_end = self.forward_until(cursor, |c| c == &TermChar::Newline, true); + pub fn lines_from_cursor(&self, offset: isize) -> RangeInclusive { + let mut start; + let mut end; + match offset.cmp(0) { + Ordering::Equal => { + return self.cur_line_range() + } + Ordering::Greater => { + let this_line = self.cur_line_range(); + start = *this_line.start(); + end = *this_line.end(); + for _ in 0..offset { + let next_ln = self.line_range_from_pos(self.num_or_len(end + 1)); + end = *this_line.end(); + } + } + Ordering::Less => { + } + } + start..=end + } + pub fn line_range_from_pos(&self, pos: usize) -> RangeInclusive { + let mut line_start = self.backward_until(pos, |c| c == &TermChar::Newline, false); + let mut line_end = self.forward_until(pos, |c| c == &TermChar::Newline, true); if self.get_char(line_start.saturating_sub(1)).is_none_or(|c| c != &TermChar::Newline) { line_start = 0; } @@ -804,6 +834,25 @@ impl LineBuf { line_start..=self.num_or_len(line_end + 1) } + pub fn cur_line_range(&self) -> RangeInclusive { + let cursor = self.cursor(); + self.line_range_from_pos(cursor) + } + pub fn on_first_line(&self) -> bool { + let cursor = self.cursor(); + let ln_start = self.backward_until(cursor, |c| c.matches("\n"), true); + !self.get_char(ln_start).is_some_and(|c| c.matches("\n")) + } + pub fn on_last_line(&self) -> bool { + let cursor = self.cursor(); + let ln_end = self.forward_until(cursor, |c| c.matches("\n"), true); + !self.get_char(ln_end).is_some_and(|c| c.matches("\n")) + } + pub fn cur_line_col(&self) -> usize { + let cursor = self.cursor(); + let ln_span = self.cur_line_range(); + cursor.saturating_sub(*ln_span.start()) + } /// Clamp a number to the length of the buffer pub fn num_or_len_minus_one(&self, num: usize) -> usize { num.min(self.buffer.len().saturating_sub(1)) @@ -902,7 +951,18 @@ impl LineBuf { } Motion::BackwardChar => MotionKind::Backward(1), Motion::ForwardChar => MotionKind::Forward(1), - Motion::LineUp => todo!(), + Motion::LineUp => { + if self.on_first_line() { + return MotionKind::Null // TODO: implement history scrolling here + } + let col = self.cur_line_col(); + let cursor = self.cursor(); + let mut ln_start = self.backward_until(cursor, |c| c.matches("\n"), true); + let ln_end = ln_start.saturating_sub(1); + ln_start = self.backward_until(ln_end, |c| c.matches("\n"), true); + let new_pos = (ln_start + col).min(ln_end); + MotionKind::To(new_pos) + } Motion::LineDown => todo!(), Motion::WholeBuffer => MotionKind::Range(0..self.buffer.len().saturating_sub(1)), Motion::BeginningOfBuffer => MotionKind::To(0), @@ -915,6 +975,9 @@ impl LineBuf { match verb { Verb::Change | Verb::Delete => { + if self.buffer.is_empty() { + return Ok(()) + } let deleted; match motion { MotionKind::Forward(n) => { @@ -942,9 +1005,12 @@ impl LineBuf { register.write_to_register(deleted); } Verb::DeleteChar(anchor) => { + if self.buffer.is_empty() { + return Ok(()) + } match anchor { Anchor::After => { - let pos = self.num_or_len(self.cursor() + 1); + let pos = self.cursor(); self.buffer.remove(pos); } Anchor::Before => { @@ -989,6 +1055,7 @@ impl LineBuf { .collect::(); self.apply_motion(MotionKind::To(r.start)); } + MotionKind::ToScreenPos(pos) => todo!(), MotionKind::Null => return Ok(()) } register.write_to_register(yanked); diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 35a11b1..320ecfa 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -29,7 +29,6 @@ impl FernVi { pub fn new(prompt: Option) -> Self { let prompt = prompt.unwrap_or("$ ".styled(Style::Green | Style::Bold)); let line = LineBuf::new().with_initial("The quick brown fox jumps over the lazy dog");//\nThe quick brown fox jumps over the lazy dog\nThe quick brown fox jumps over the lazy dog\n"); - Self { term: Terminal::new(), line, @@ -39,6 +38,12 @@ impl FernVi { last_movement: None, } } + pub fn calculate_prompt_offset(&self) -> usize { + if self.prompt.ends_with('\n') { + return 0 + } + strip_ansi_codes_and_escapes(self.prompt.lines().last().unwrap_or_default()).width() + } pub fn clear_line(&self) { let prompt_lines = self.prompt.lines().count(); let last_line_len = strip_ansi_codes_and_escapes(self.prompt.lines().last().unwrap_or_default()).width(); @@ -98,6 +103,7 @@ impl FernVi { self.term.write(&self.mode.cursor_style()); } pub fn readline(&mut self) -> ShResult { + self.line.set_first_line_offset(self.calculate_prompt_offset()); let dims = self.term.get_dimensions()?; self.line.update_term_dims(dims.0, dims.1); self.print_buf(false); From 1e3715d3537e20d4fc3f9cfbe08f7c6d3964edb5 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Tue, 27 May 2025 02:41:19 -0400 Subject: [PATCH 14/19] prompt and buffer drawing appears functional --- src/fern.rs | 9 +- src/prompt/mod.rs | 13 +- src/prompt/readline/linebuf.rs | 1816 +++++++++++++++---------------- src/prompt/readline/mod.rs | 147 ++- src/prompt/readline/mode.rs | 9 +- src/prompt/readline/register.rs | 73 +- src/prompt/readline/term.rs | 156 ++- src/prompt/readline/vicmd.rs | 10 +- src/shopt.rs | 3 +- 9 files changed, 1114 insertions(+), 1122 deletions(-) diff --git a/src/fern.rs b/src/fern.rs index 4ebb998..3caf949 100644 --- a/src/fern.rs +++ b/src/fern.rs @@ -24,7 +24,8 @@ use crate::signal::sig_setup; use crate::state::source_rc; use crate::prelude::*; use clap::Parser; -use state::{read_vars, write_vars}; +use shopt::FernEditMode; +use state::{read_shopts, read_vars, write_shopts, write_vars}; #[derive(Parser,Debug)] struct FernArgs { @@ -98,7 +99,11 @@ fn fern_interactive() { let mut readline_err_count: u32 = 0; loop { // Main loop - let input = match prompt::read_line() { + let edit_mode = write_shopts(|opt| opt.query("prompt.edit_mode")) + .unwrap() + .map(|mode| mode.parse::().unwrap_or_default()) + .unwrap(); + let input = match prompt::read_line(edit_mode) { Ok(line) => { readline_err_count = 0; line diff --git a/src/prompt/mod.rs b/src/prompt/mod.rs index eb92a18..e727de6 100644 --- a/src/prompt/mod.rs +++ b/src/prompt/mod.rs @@ -3,9 +3,9 @@ pub mod highlight; use std::path::Path; -use readline::FernVi; +use readline::{FernVi, Readline}; -use crate::{expand::expand_prompt, libsh::error::ShResult, prelude::*, state::read_shopts}; +use crate::{expand::expand_prompt, libsh::error::ShResult, prelude::*, shopt::FernEditMode, state::read_shopts}; /// Initialize the line editor fn get_prompt() -> ShResult { @@ -20,8 +20,13 @@ fn get_prompt() -> ShResult { Ok(format!("\n{}",expand_prompt(&prompt)?)) } -pub fn read_line() -> ShResult { +pub fn read_line(edit_mode: FernEditMode) -> ShResult { + dbg!("hi"); let prompt = get_prompt()?; - let mut reader = FernVi::new(Some(prompt)); + let mut reader: Box = match edit_mode { + FernEditMode::Vi => Box::new(FernVi::new(Some(prompt))), + FernEditMode::Emacs => todo!() + }; + dbg!("there"); reader.readline() } diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index 0fae256..0c1de60 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -1,5 +1,6 @@ -use std::{cmp::Ordering, fmt::Display, ops::{Deref, DerefMut, Range, RangeBounds, RangeInclusive}, sync::Arc}; +use std::{cmp::Ordering, fmt::Display, ops::{Deref, DerefMut, Range, RangeBounds, RangeInclusive}, str::FromStr, sync::Arc}; +use unicode_segmentation::UnicodeSegmentation; use unicode_width::UnicodeWidthStr; use crate::libsh::{error::ShResult, sys::sh_quit, term::{Style, Styled}}; @@ -10,7 +11,9 @@ use super::vicmd::{Anchor, Bound, Dest, Direction, Motion, RegisterName, TextObj #[derive(Debug, PartialEq, Eq)] pub enum CharClass { Alphanum, - Symbol + Symbol, + Whitespace, + Other } #[derive(Debug, Clone, PartialEq, Eq)] @@ -18,7 +21,7 @@ pub enum MotionKind { Forward(usize), To(usize), Backward(usize), - Range(Range), + Range((usize,usize)), Line(isize), // positive = up line, negative = down line ToLine(usize), Null, @@ -41,156 +44,44 @@ impl MotionKind { std::ops::Bound::Unbounded => panic!("called range constructor with no upper bound") }; if end > start { - Self::Range(start..end) + Self::Range((start,end)) } else { - Self::Range(end..start) + Self::Range((end,start)) } } } -#[derive(Clone,Default,Debug)] -pub struct TermCharBuf(pub Vec); - -impl Deref for TermCharBuf { - type Target = Vec; - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl DerefMut for TermCharBuf { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - -impl Display for TermCharBuf { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - for ch in &self.0 { - match ch { - TermChar::Grapheme(str) => write!(f, "{str}")?, - TermChar::Newline => write!(f, "\r\n")?, - } +impl From<&str> for CharClass { + fn from(value: &str) -> Self { + if value.len() > 1 { + return Self::Symbol // Multi-byte grapheme } - Ok(()) - } -} -impl FromIterator for TermCharBuf { - fn from_iter>(iter: T) -> Self { - let mut buf = vec![]; - for item in iter { - buf.push(item) - } - Self(buf) - } -} - -impl From for String { - fn from(value: TermCharBuf) -> Self { - let mut string = String::new(); - for char in value.0 { - match char { - TermChar::Grapheme(str) => string.push_str(&str), - TermChar::Newline => { - string.push('\r'); - string.push('\n'); - } - } - } - string - } -} - -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub enum TermChar { - Grapheme(Arc), - // Treated as '\n' in the code, printed as '\r\n' to the terminal - Newline -} - -impl TermChar { - pub fn is_whitespace(&self) -> bool { - match self { - TermChar::Newline => true, - TermChar::Grapheme(ch) => { - ch.chars().next().is_some_and(|c| c.is_whitespace()) - } - } - } - pub fn matches(&self, other: &str) -> bool { - match self { - TermChar::Grapheme(ch) => { - ch.as_ref() == other - } - TermChar::Newline => other == "\n" - } - } -} - -impl From> for TermChar { - fn from(value: Arc) -> Self { - Self::Grapheme(value) - } -} - -impl From for TermChar { - fn from(value: char) -> Self { - match value { - '\n' => Self::Newline, - ch => Self::Grapheme(Arc::from(ch.to_string())) - } - } -} - -impl Display for TermChar { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - TermChar::Grapheme(str) => { - write!(f,"{str}") - } - TermChar::Newline => { - write!(f,"\r\n") - } - } - } -} - -impl From<&TermChar> for CharClass { - fn from(value: &TermChar) -> Self { - match value { - TermChar::Newline => Self::Symbol, - TermChar::Grapheme(ch) => { - if ch.chars().next().is_some_and(|c| c.is_alphanumeric()) { - Self::Alphanum - } else { - Self::Symbol - } - } - } - } -} - -impl From for CharClass { - fn from(value: char) -> Self { - if value.is_alphanumeric() { - Self::Alphanum + if value.chars().all(char::is_alphanumeric) { + CharClass::Alphanum + } else if value.chars().all(char::is_whitespace) { + CharClass::Whitespace + } else if !value.chars().all(char::is_alphanumeric) { + CharClass::Symbol } else { - Self::Symbol + Self::Other } } } -fn is_other_class_or_ws(a: &TermChar, b: &TermChar) -> bool { - if a.is_whitespace() || b.is_whitespace() { - return true; - } - CharClass::from(a) != CharClass::from(b) +fn is_other_class_or_ws(a: &str, b: &str) -> bool { + let a = CharClass::from(a); + let b = CharClass::from(b); + if a == CharClass::Whitespace || b == CharClass::Whitespace { + true + } else { + a != b + } } pub struct UndoPayload { - buffer: TermCharBuf, + buffer: String, cursor: usize } @@ -198,19 +89,19 @@ pub struct UndoPayload { pub struct Edit { pub pos: usize, pub cursor_pos: usize, - pub old: TermCharBuf, - pub new: TermCharBuf + pub old: String, + pub new: String, } impl Edit { - pub fn diff(a: TermCharBuf, b: TermCharBuf, old_cursor_pos: usize) -> Self { + pub fn diff(a: &str, b: &str, old_cursor_pos: usize) -> Edit { use std::cmp::min; let mut start = 0; let max_start = min(a.len(), b.len()); // Calculate the prefix of the edit - while start < max_start && a[start] == b[start] { + while start < max_start && a.as_bytes()[start] == b.as_bytes()[start] { start += 1; } @@ -218,43 +109,42 @@ impl Edit { return Edit { pos: start, cursor_pos: old_cursor_pos, - old: TermCharBuf(vec![]), - new: TermCharBuf(vec![]), - } + old: String::new(), + new: String::new(), + }; } let mut end_a = a.len(); let mut end_b = b.len(); // Calculate the suffix of the edit - while end_a > start && end_b > start && a[end_a - 1] == b[end_b - 1] { + while end_a > start && end_b > start && a.as_bytes()[end_a - 1] == b.as_bytes()[end_b - 1] { end_a -= 1; end_b -= 1; } - // Slice off the prefix and suffix for both - let old = TermCharBuf(a[start..end_a].to_vec()); - let new = TermCharBuf(b[start..end_b].to_vec()); + // Slice off the prefix and suffix for both (safe because start/end are byte offsets) + let old = a[start..end_a].to_string(); + let new = b[start..end_b].to_string(); Edit { pos: start, cursor_pos: old_cursor_pos, old, - new + new, } } } #[derive(Default,Debug)] pub struct LineBuf { - buffer: TermCharBuf, + buffer: String, cursor: usize, clamp_cursor: bool, first_line_offset: usize, merge_edit: bool, undo_stack: Vec, redo_stack: Vec, - term_dims: (usize,usize) } impl LineBuf { @@ -262,917 +152,905 @@ impl LineBuf { Self::default() } pub fn with_initial(mut self, initial: &str) -> Self { - let chars = initial.chars(); - for char in chars { - self.buffer.push(char.into()) - } + self.buffer = initial.to_string(); self } - pub fn set_first_line_offset(&mut self, offset: usize) { - self.first_line_offset = offset + pub fn as_str(&self) -> &str { + &self.buffer + } + pub fn take(&mut self) -> String { + let line = std::mem::take(&mut self.buffer); + *self = Self::default(); + line + } + pub fn byte_pos(&self) -> usize { + self.cursor + } + pub fn byte_len(&self) -> usize { + self.buffer.len() + } + pub fn is_empty(&self) -> bool { + self.buffer.is_empty() + } + pub fn clamp_cursor(&mut self) { + // Normal mode does not allow you to sit on the edge of the buffer, you must be hovering over a character + // Insert mode does let you set on the edge though, so that you can append new characters + // This method is used in Normal mode + dbg!("clamping"); + if self.cursor == self.byte_len() { + self.cursor_back(1); + } + } + pub fn grapheme_len(&self) -> usize { + self.buffer.grapheme_indices(true).count() + } + pub fn slice_from_cursor(&self) -> &str { + &self.buffer[self.cursor..] + } + pub fn slice_to_cursor(&self) -> &str { + if let Some(slice) = self.buffer.get(..self.cursor) { + slice + } else { + &self.buffer + } + + } + pub fn slice_from_cursor_to_end_of_line(&self) -> &str { + let end = self.end_of_line(); + &self.buffer[self.cursor..end] + } + pub fn slice_from_start_of_line_to_cursor(&self) -> &str { + let start = self.start_of_line(); + &self.buffer[start..self.cursor] + } + pub fn slice_from(&self, pos: usize) -> &str { + &self.buffer[pos..] + } + pub fn slice_to(&self, pos: usize) -> &str { + &self.buffer[..pos] } pub fn set_cursor_clamp(&mut self, yn: bool) { self.clamp_cursor = yn } - pub fn buffer(&self) -> &TermCharBuf { - &self.buffer - } - pub fn cursor(&self) -> usize { - self.cursor - } - pub fn cursor_char(&self) -> Option<&TermChar> { - let tc = self.buffer.get(self.cursor())?; - Some(tc) - } - pub fn get_char(&self, pos: usize) -> Option<&TermChar> { - let tc = self.buffer.get(pos)?; - Some(tc) - } - pub fn insert_at_cursor(&mut self, tc: TermChar) { - let cursor = self.cursor(); - self.buffer.insert(cursor,tc) - } - pub fn count_lines(&self, first_line_offset: usize) -> usize { - let mut cur_line_len = 0; - let mut lines = 1; - let first_line_max_len = self.term_dims.1.saturating_sub(first_line_offset); - for char in self.buffer.iter() { - match char { - TermChar::Newline => { - lines += 1; - cur_line_len = 0; - } - TermChar::Grapheme(str) => { - cur_line_len += str.width().max(1); - if (lines == 1 && first_line_max_len > 0 && cur_line_len >= first_line_max_len) || cur_line_len > self.term_dims.1 { - lines += 1; - cur_line_len = 0; - } - } - } - } - lines - } - pub fn cursor_back(&mut self, count: usize) { - self.cursor = self.cursor.saturating_sub(count) - } - pub fn cursor_fwd(&mut self, count: usize) { - self.cursor = self.num_or_len(self.cursor + count) - } - pub fn cursor_to(&mut self, pos: usize) { - self.cursor = self.num_or_len(pos) - } - pub fn prepare_line(&self) -> String { - self.buffer.to_string() - } - pub fn clamp_cursor(&mut self) { - if self.cursor_char().is_none() && !self.buffer.is_empty() { - self.cursor = self.cursor.saturating_sub(1) - } - } - pub fn update_term_dims(&mut self, x: usize, y: usize) { - self.term_dims = (x,y) - } - pub fn cursor_display_coords(&self, first_line_offset: Option) -> (usize, usize) { - let mut x = 0; - let mut y = 0; - let first_line_max_len = first_line_offset.map(|fl| self.term_dims.1.saturating_sub(fl)).unwrap_or_default(); - for i in 0..self.cursor() { - let ch = self.get_char(i).unwrap(); - match ch { - TermChar::Grapheme(str) => { - x += str.width().max(1); - if (y == 0 && first_line_max_len > 0 && x >= first_line_max_len) || x > self.term_dims.1 { - y += 1; - x = 0; - } - } - TermChar::Newline => { - y += 1; - x = 0; - } - } - } - - (x, y) - } - pub fn split_lines(&self) -> Vec { - let line = self.prepare_line(); - let mut lines = vec![]; - let mut cur_line = String::new(); - for ch in line.chars() { - match ch { - '\n' => lines.push(std::mem::take(&mut cur_line)), - _ => cur_line.push(ch) - } - } - lines.push(cur_line); - lines - } - pub fn on_word_bound(&self, word: Word, pos: usize, dir: Direction) -> bool { - let check_pos = match dir { - Direction::Forward => self.num_or_len(pos + 1), - Direction::Backward => pos.saturating_sub(1) - }; - let Some(curr_char) = self.cursor_char() else { - return false - }; - self.get_char(check_pos).is_some_and(|c| { - match word { - Word::Big => c.is_whitespace(), - Word::Normal => is_other_class_or_ws(curr_char, c) - } - }) - } - fn backward_until bool>(&self, mut start: usize, cond: F, inclusive: bool) -> usize { - start = self.num_or_len_minus_one(start); - while start > 0 && !cond(&self.buffer[start]) { - start -= 1; - } - if !inclusive { - if start > 0 { - start.saturating_add(1) - } else { - start - } + pub fn grapheme_at_cursor(&self) -> Option<&str> { + if self.cursor == self.byte_len() { + None } else { - start + self.slice_from_cursor().graphemes(true).next() } } - fn forward_until bool>(&self, mut start: usize, cond: F, inclusive: bool) -> usize { - while start < self.buffer.len() && !cond(&self.buffer[start]) { - start += 1; - } - if !inclusive { - if start < self.buffer.len() { - start.saturating_sub(1) - } else { - start - } - } else { - start - } - } - pub fn find_word_pos(&self, word: Word, dest: To, dir: Direction) -> usize { - let mut pos = self.cursor(); - match dir { - Direction::Forward => { - match word { - Word::Big => { - match dest { - To::Start => { - if self.on_word_bound(word, pos, dir) { - // Push the cursor off of the word - pos = self.num_or_len(pos + 1); - } - // Pass the current word if any - if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { - pos = self.forward_until(pos, |c| c.is_whitespace(), true); - } - // Land on the start of the next word - pos = self.forward_until(pos, |c| !c.is_whitespace(), true) - } - To::End => { - if self.on_word_bound(word, pos, dir) { - // Push the cursor off of the word - pos = self.num_or_len(pos + 1); - } - if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { - // We are in a word - // Go to the end of the current word - pos = self.forward_until(pos, |c| c.is_whitespace(), false) - } else { - // We are outside of a word - // Find the next word, then go to the end of it - pos = self.forward_until(pos, |c| !c.is_whitespace(), true); - pos = self.forward_until(pos, |c| c.is_whitespace(), false) - } - } - } - } - Word::Normal => { - match dest { - To::Start => { - if self.on_word_bound(word, pos, dir) { - // Push the cursor off of the word - pos = self.num_or_len(pos + 1); - } - if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { - // We are inside of a word - // Find the next instance of whitespace or a different char class - let this_char = self.get_char(pos).unwrap(); - pos = self.forward_until(pos, |c| is_other_class_or_ws(this_char, c), true); - - // If we found whitespace, continue until we find non-whitespace - if self.get_char(pos).is_some_and(|c| c.is_whitespace()) { - pos = self.forward_until(pos, |c| !c.is_whitespace(), true) - } - } else { - // We are in whitespace, proceed to the next word - pos = self.forward_until(pos, |c| !c.is_whitespace(), true) - } - } - To::End => { - if self.on_word_bound(word, pos, dir) { - // Push the cursor off of the word - pos = self.num_or_len(pos + 1); - } - if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { - // Proceed up until the next differing char class - let this_char = self.get_char(pos).unwrap(); - pos = self.forward_until(pos, |c| is_other_class_or_ws(this_char, c), false); - } else { - // Find the next non-whitespace character - pos = self.forward_until(pos, |c| !c.is_whitespace(), true); - // Then proceed until a differing char class is found - let this_char = self.get_char(pos).unwrap(); - pos = self.forward_until(pos, |c|is_other_class_or_ws(this_char, c), false); - } - } - } - } - } - } - Direction::Backward => { - match word { - Word::Big => { - match dest { - To::Start => { - if self.on_word_bound(word, pos, dir) { - // Push the cursor off - pos = pos.saturating_sub(1); - } - if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { - // We are in a word, go to the start of it - pos = self.backward_until(pos, |c| c.is_whitespace(), false); - } else { - // We are not in a word, find one and go to the start of it - pos = self.backward_until(pos, |c| !c.is_whitespace(), true); - pos = self.backward_until(pos, |c| c.is_whitespace(), false); - } - } - To::End => { - if self.on_word_bound(word, pos, dir) { - pos = pos.saturating_sub(1); - } - - if self.get_char(pos).is_some_and(|c| c.is_whitespace()) { - pos = self.backward_until(pos, |c| !c.is_whitespace(), true); - } else { - pos = self.backward_until(pos, |c| c.is_whitespace(), true); - pos = self.backward_until(pos, |c| !c.is_whitespace(), true); - } - } - } - } - Word::Normal => { - match dest { - To::Start => { - if self.on_word_bound(word, pos, dir) { - pos = pos.saturating_sub(1); - } - if self.get_char(pos).is_some_and(|c| !c.is_whitespace()) { - let this_char = self.get_char(pos).unwrap(); - pos = self.backward_until(pos, |c| is_other_class_or_ws(this_char, c), false) - } else { - pos = self.backward_until(pos, |c| !c.is_whitespace(), true); - let this_char = self.get_char(pos).unwrap(); - pos = self.backward_until(pos, |c| is_other_class_or_ws(this_char, c), false); - } - } - To::End => { - if self.on_word_bound(word, pos, dir) { - // Nudge - pos = pos.saturating_sub(1); - } - // If we are on whitespace, proceed until we are not, inclusively - if self.get_char(pos).is_some_and(|c| c.is_whitespace()) { - pos = self.backward_until(pos, |c| !c.is_whitespace(), true) - } else { - // If we are not on whitespace, proceed until we hit something different, inclusively - let this_char = self.get_char(pos).unwrap(); - pos = self.backward_until(pos, |c| is_other_class_or_ws(this_char, c), true); - // If we landed on whitespace, proceed until we are not on whitespace - if self.get_char(pos).is_some_and(|c| c.is_whitespace()) { - pos = self.backward_until(pos, |c| !c.is_whitespace(), true) - } - } - } - } - } - } - } - } - pos - } - pub fn eval_quote_obj(&self, target: &str, bound: Bound) -> Range { - let mut end; - let start; - let cursor = self.cursor(); - let ln_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); - let mut line_chars = self.buffer[ln_start..cursor].iter(); - let mut in_quote = false; - while let Some(ch) = line_chars.next() { - let TermChar::Grapheme(ch) = ch else { unreachable!() }; - match ch.as_ref() { - "\\" => { - line_chars.next(); - } - "\"" => in_quote = !in_quote, - _ => { /* continue */ } - } - } - let mut start_pos = cursor; - let end_pos; - if !in_quote { - start_pos = self.forward_until(start_pos, |c| c.matches("\n") || c.matches(target), true); - if !self.get_char(start_pos).is_some_and(|c| c.matches(target)) { - return cursor..cursor - } - end_pos = self.forward_until(start_pos, |c| c.matches("\n") || c.matches(target), true); - if !self.get_char(end_pos).is_some_and(|c| c.matches(target)) { - return cursor..cursor - } - start = start_pos; - end = end_pos; - } else { - start_pos = self.backward_until(start_pos, |c| c.matches("\n") || c.matches(target), true); - if !self.get_char(start_pos).is_some_and(|c| c.matches(target)) { - return cursor..cursor - } - end_pos = self.forward_until(self.num_or_len(start_pos + 1), |c| c.matches("\n") || c.matches(target), true); - if !self.get_char(end_pos).is_some_and(|c| c.matches(target)) { - return cursor..cursor - } - start = start_pos; - end = self.num_or_len(end_pos + 1); - - if bound == Bound::Around && self.get_char(end).is_some_and(|c| c.is_whitespace()) { - end += 1; - end = self.forward_until(end, |c| !c.is_whitespace(), true); - } - } - mk_range(start,end) - } - pub fn eval_delim_obj(&self, obj: &TextObj, bound: Bound) -> Range { - // FIXME: logic isn't completely robust i think - let opener = match obj { - TextObj::Brace => "{", - TextObj::Bracket => "[", - TextObj::Paren => "(", - TextObj::Angle => "<", - _ => unreachable!() - }; - let closer = match obj { - TextObj::Brace => "}", - TextObj::Bracket => "]", - TextObj::Paren => ")", - TextObj::Angle => ">", - _ => unreachable!() - }; - let mut end = None; - let mut start = None; - let mut delim_count: usize = 0; - let ln_range = self.cur_line_range(); - let cursor = self.cursor(); - let mut ln_chars = self.buffer[*ln_range.start()..cursor].iter().enumerate(); - while let Some((i,ch)) = ln_chars.next() { - let &TermChar::Grapheme(ch) = &ch else { unreachable!() }; - match ch.as_ref() { - "\\" => { - ln_chars.next(); - } - ch if ch == opener => { - start = Some(ln_range.start() + i); - delim_count += 1; - } - ch if ch == closer => delim_count -= 1, - _ => {} - } - } - - let mut start_pos = None; - let mut end_pos = None; - if delim_count == 0 { - let mut ln_chars = self.buffer[cursor..*ln_range.end()].iter().enumerate(); - while let Some((i,ch)) = ln_chars.next() { - let &TermChar::Grapheme(ch) = &ch else { unreachable!() }; - match ch.as_ref() { - "\\" => { - ln_chars.next(); - } - ch if ch == opener => { - if delim_count == 0 { - start_pos = Some(cursor + i); - } - delim_count += 1; - } - ch if ch == closer => { - delim_count -= 1; - if delim_count == 0 { - end_pos = Some(cursor + i); - } - } - _ => {} - } - } - - if start_pos.is_none() || end_pos.is_none() { - return cursor..cursor - } else { - start = start_pos; - end = end_pos; - } - } else { - let Some(strt) = start else { - dbg!("no start"); - dbg!("no start"); - dbg!("no start"); - dbg!("no start"); - dbg!("no start"); - dbg!("no start"); - return cursor..cursor - }; - let strt = self.num_or_len(strt + 1); // skip the paren - let target = delim_count.saturating_sub(1); - let mut ln_chars = self.buffer[strt..*ln_range.end()].iter().enumerate(); - dbg!(&ln_chars); - dbg!(&ln_chars); - dbg!(&ln_chars); - dbg!(&ln_chars); - - while let Some((i,ch)) = ln_chars.next() { - let &TermChar::Grapheme(ch) = &ch else { unreachable!() }; - match ch.as_ref() { - "\\" => { - ln_chars.next(); - } - ch if ch == opener => { - delim_count += 1; - } - ch if ch == closer => { - delim_count -= 1; - if delim_count == target { - end_pos = Some(strt + i); - } - } - _ => {} - } - } - dbg!(end_pos); - dbg!(end_pos); - dbg!(end_pos); - dbg!(start_pos); - dbg!(start_pos); - dbg!(start_pos); - dbg!(start_pos); - dbg!(start_pos); - dbg!(start_pos); - dbg!(start_pos); - if end_pos.is_none() { - return cursor..cursor - } else { - end = end_pos; - } - } - - let Some(mut start) = start else { - return cursor..cursor - }; - let Some(mut end) = end else { - return cursor..cursor - }; - match bound { - Bound::Inside => { - end = end.saturating_sub(1); - start = self.num_or_len(start + 1); - mk_range(start,end) - } - Bound::Around => mk_range(start,end) - } - - } - pub fn eval_text_obj(&self, obj: TextObj, bound: Bound) -> Range { - let mut start; - let mut end; - - match obj { - TextObj::Word(word) => { - start = match self.on_word_bound(word, self.cursor(), Direction::Backward) { - true => self.cursor(), - false => self.find_word_pos(word, To::Start, Direction::Backward), - }; - end = match self.on_word_bound(word, self.cursor(), Direction::Forward) { - true => self.cursor(), - false => self.find_word_pos(word, To::End, Direction::Forward), - }; - end = self.num_or_len(end + 1); - if bound == Bound::Around { - end = self.forward_until(end, |c| c.is_whitespace(), true); - end = self.forward_until(end, |c| !c.is_whitespace(), true); - } - return start..end - } - TextObj::Line => { - let cursor = self.cursor(); - start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); - end = self.forward_until(cursor, |c| c == &TermChar::Newline, true); - } - TextObj::Sentence => todo!(), - TextObj::Paragraph => todo!(), - TextObj::DoubleQuote => return self.eval_quote_obj("\"", bound), - TextObj::SingleQuote => return self.eval_quote_obj("'", bound), - TextObj::BacktickQuote => return self.eval_quote_obj("`", bound), - TextObj::Paren | - TextObj::Bracket | - TextObj::Brace | - TextObj::Angle => return self.eval_delim_obj(&obj, bound), - TextObj::Tag => todo!(), - TextObj::Custom(_) => todo!(), - } - - if bound == Bound::Inside { - start = self.num_or_len_minus_one(start + 1); - end = end.saturating_sub(1); - } - start..end - } - pub fn validate_range(&self, range: &Range) -> bool { - range.end < self.buffer.len() - } - pub fn lines_from_cursor(&self, offset: isize) -> RangeInclusive { - let mut start; - let mut end; - match offset.cmp(0) { + pub fn grapheme_at_cursor_offset(&self, offset: isize) -> Option<&str> { + match offset.cmp(&0) { Ordering::Equal => { - return self.cur_line_range() - } - Ordering::Greater => { - let this_line = self.cur_line_range(); - start = *this_line.start(); - end = *this_line.end(); - for _ in 0..offset { - let next_ln = self.line_range_from_pos(self.num_or_len(end + 1)); - end = *this_line.end(); - } + return self.grapheme_at(self.cursor); } Ordering::Less => { + // Walk backward from the start of the line or buffer up to the cursor + // and count graphemes in reverse. + let rev_graphemes: Vec<&str> = self.slice_to_cursor().graphemes(true).collect(); + let idx = rev_graphemes.len().checked_sub((-offset) as usize)?; + rev_graphemes.get(idx).copied() + } + Ordering::Greater => { + self.slice_from_cursor() + .graphemes(true) + .nth(offset as usize) } } - start..=end } - pub fn line_range_from_pos(&self, pos: usize) -> RangeInclusive { - let mut line_start = self.backward_until(pos, |c| c == &TermChar::Newline, false); - let mut line_end = self.forward_until(pos, |c| c == &TermChar::Newline, true); - if self.get_char(line_start.saturating_sub(1)).is_none_or(|c| c != &TermChar::Newline) { - line_start = 0; + pub fn grapheme_at(&self, pos: usize) -> Option<&str> { + if pos >= self.byte_len() { + None + } else { + self.buffer.graphemes(true).nth(pos) } - if self.get_char(line_end).is_none_or(|c| c != &TermChar::Newline) { - line_end = self.buffer.len().saturating_sub(1); - line_start = self.backward_until(line_start, |c| c == &TermChar::Newline, true) + } + pub fn is_whitespace(&self, pos: usize) -> bool { + let Some(g) = self.grapheme_at(pos) else { + return false + }; + g.chars().all(char::is_whitespace) + } + pub fn on_whitespace(&self) -> bool { + self.is_whitespace(self.cursor) + } + pub fn next_pos(&self, n: usize) -> Option { + if self.cursor == self.byte_len() { + None + } else { + self.slice_from_cursor() + .grapheme_indices(true) + .take(n) + .last() + .map(|(i,s)| i + self.cursor + s.len()) + } + } + pub fn prev_pos(&self, n: usize) -> Option { + if self.cursor == 0 { + None + } else { + self.slice_to_cursor() + .grapheme_indices(true) + .rev() // <- walk backward + .take(n) + .last() + .map(|(i, _)| i) + } + } + pub fn cursor_back(&mut self, dist: usize) -> bool { + let Some(pos) = self.prev_pos(dist) else { + return false + }; + self.cursor = pos; + true + } + /// Up to but not including 'dist' + pub fn cursor_back_to(&mut self, dist: usize) -> bool { + let dist = dist.saturating_sub(1); + let Some(pos) = self.prev_pos(dist) else { + return false + }; + self.cursor = pos; + true + } + pub fn cursor_fwd(&mut self, dist: usize) -> bool { + let Some(pos) = self.next_pos(dist) else { + return false + }; + self.cursor = pos; + true + } + pub fn cursor_fwd_to(&mut self, dist: usize) -> bool { + let dist = dist.saturating_sub(1); + let Some(pos) = self.next_pos(dist) else { + return false + }; + self.cursor = pos; + true + } + pub fn count_display_lines(&self, offset: usize, term_width: usize) -> usize { + let mut lines = 0; + let mut col = offset.max(1); + for ch in self.buffer.chars() { + match ch { + '\n' => { + lines += 1; + col = 1; + } + _ => { + col += 1; + if col > term_width { + lines += 1; + col = 1 + } + } + } + } + lines + } + pub fn cursor_display_line_position(&self, offset: usize, term_width: usize) -> usize { + let mut lines = 0; + let mut col = offset.max(1); + for ch in self.slice_to_cursor().chars() { + match ch { + '\n' => { + lines += 1; + col = 1; + } + _ => { + col += 1; + if col > term_width { + lines += 1; + col = 1 + } + } + } + } + lines + } + pub fn display_coords(&self, term_width: usize) -> (usize,usize) { + let mut chars = self.slice_to_cursor().chars(); + + let mut lines = 0; + let mut col = 0; + for ch in chars { + match ch { + '\n' => { + lines += 1; + col = 1; + } + _ => { + col += 1; + if col > term_width { + lines += 1; + col = 1 + } + } + } + } + (lines,col) + } + pub fn cursor_display_coords(&self, first_ln_offset: usize, term_width: usize) -> (usize,usize) { + let (d_line,mut d_col) = self.display_coords(term_width); + let line = self.count_display_lines(first_ln_offset, term_width) - d_line; + + if line == self.count_lines() { + d_col += first_ln_offset; } - line_start..=self.num_or_len(line_end + 1) + (line,d_col) } - pub fn cur_line_range(&self) -> RangeInclusive { - let cursor = self.cursor(); - self.line_range_from_pos(cursor) + pub fn insert(&mut self, ch: char) { + if self.buffer.is_empty() { + self.buffer.push(ch) + } else { + self.buffer.insert(self.cursor, ch); + } } - pub fn on_first_line(&self) -> bool { - let cursor = self.cursor(); - let ln_start = self.backward_until(cursor, |c| c.matches("\n"), true); - !self.get_char(ln_start).is_some_and(|c| c.matches("\n")) + pub fn move_to(&mut self, pos: usize) -> bool { + if self.cursor == pos { + false + } else { + self.cursor = pos; + true + } } - pub fn on_last_line(&self) -> bool { - let cursor = self.cursor(); - let ln_end = self.forward_until(cursor, |c| c.matches("\n"), true); - !self.get_char(ln_end).is_some_and(|c| c.matches("\n")) + pub fn move_buf_start(&mut self) -> bool { + self.move_to(0) } - pub fn cur_line_col(&self) -> usize { - let cursor = self.cursor(); - let ln_span = self.cur_line_range(); - cursor.saturating_sub(*ln_span.start()) + pub fn move_buf_end(&mut self) -> bool { + self.move_to(self.byte_len()) } - /// Clamp a number to the length of the buffer - pub fn num_or_len_minus_one(&self, num: usize) -> usize { - num.min(self.buffer.len().saturating_sub(1)) + pub fn move_home(&mut self) -> bool { + let start = self.start_of_line(); + self.move_to(start) } - pub fn num_or_len(&self, num: usize) -> usize { - num.min(self.buffer.len()) + pub fn move_end(&mut self) -> bool { + let end = self.end_of_line(); + self.move_to(end) + } + pub fn start_of_line(&self) -> usize { + if let Some(i) = self.slice_to_cursor().rfind('\n') { + i + 1 // Land on start of this line, instead of the end of the last one + } else { + 0 + } + } + pub fn end_of_line(&self) -> usize { + if let Some(i) = self.slice_from_cursor().find('\n') { + i + self.cursor + } else { + self.byte_len() + } + } + pub fn this_line(&self) -> (usize,usize) { + ( + self.start_of_line(), + self.end_of_line() + ) + } + pub fn count_lines(&self) -> usize { + self.buffer + .chars() + .filter(|&c| c == '\n') + .count() + } + pub fn line_no(&self) -> usize { + self.slice_to_cursor() + .chars() + .filter(|&c| c == '\n') + .count() + } + /// Returns the (start, end) byte range for the given line number. + /// + /// - Line 0 starts at the beginning of the buffer and ends at the first newline (or end of buffer). + /// - Line 1 starts just after the first newline, ends at the second, etc. + /// + /// Returns `None` if the line number is beyond the last line in the buffer. + pub fn select_line(&self, n: usize) -> Option<(usize, usize)> { + let mut start = 0; + + let bytes = self.as_str(); // or whatever gives the full buffer as &str + let mut line_iter = bytes.match_indices('\n').map(|(i, _)| i + 1); + + // Advance to the nth newline (start of line n) + for _ in 0..n { + start = line_iter.next()?; + } + + // Find the next newline (end of line n), or end of buffer + let end = line_iter.next().unwrap_or(bytes.len()); + + Some((start, end)) + } + /// Find the span from the start of the nth line above the cursor, to the end of the current line. + /// + /// Returns (start,end) + /// 'start' is the first character after the previous newline, or the start of the buffer + /// 'end' is the index of the newline after the nth line + /// + /// The caller can choose whether to include the newline itself in the selection by using either + /// * `(start..end)` to exclude it + /// * `(start..=end)` to include it + pub fn select_lines_up(&self, n: usize) -> (usize,usize) { + let end = self.end_of_line(); + let mut start = self.start_of_line(); + if start == 0 { + return (start,end) + } + + for _ in 0..n { + if let Some(prev_newline) = self.slice_to(start - 1).rfind('\n') { + start = prev_newline + 1; + } else { + start = 0; + break + } + } + + (start,end) + } + /// Find the range from the start of this line, to the end of the nth line after the cursor + /// + /// Returns (start,end) + /// 'start' is the first character after the previous newline, or the start of the buffer + /// 'end' is the index of the newline after the nth line + /// + /// The caller can choose whether to include the newline itself in the selection by using either + /// * `(start..end)` to exclude it + /// * `(start..=end)` to include it + pub fn select_lines_down(&self, n: usize) -> (usize,usize) { + let mut end = self.end_of_line(); + let start = self.start_of_line(); + if end == self.byte_len() { + return (start,end) + } + + for _ in 0..n { + if let Some(next_newline) = self.slice_from(end).find('\n') { + end = next_newline + } else { + end = self.byte_len(); + break + } + } + + (start,end) + } + pub fn select_lines_to(&self, line_no: usize) -> (usize,usize) { + let cursor_line_no = self.line_no(); + let offset = (cursor_line_no as isize) - (line_no as isize); + match offset.cmp(&0) { + Ordering::Less => self.select_lines_down(offset.unsigned_abs()), + Ordering::Equal => self.this_line(), + Ordering::Greater => self.select_lines_up(offset as usize) + } + } + fn on_start_of_word(&self, size: Word) -> bool { + self.is_start_of_word(size, self.cursor) + } + fn on_end_of_word(&self, size: Word) -> bool { + self.is_end_of_word(size, self.cursor) + } + fn is_start_of_word(&self, size: Word, pos: usize) -> bool { + if self.grapheme_at(pos).is_some_and(|g| g.chars().all(char::is_whitespace)) { + return false + } + match size { + Word::Big => { + let Some(prev_g) = self.grapheme_at(pos.saturating_sub(1)) else { + return true // We are on the very first grapheme, so it is the start of a word + }; + prev_g.chars().all(char::is_whitespace) + } + Word::Normal => { + let Some(cur_g) = self.grapheme_at(pos) else { + return false // We aren't on a character to begin with + }; + let Some(prev_g) = self.grapheme_at(pos.saturating_sub(1)) else { + return true + }; + is_other_class_or_ws(cur_g, prev_g) + } + } + } + fn is_end_of_word(&self, size: Word, pos: usize) -> bool { + if self.grapheme_at(pos).is_some_and(|g| g.chars().all(char::is_whitespace)) { + return false + } + match size { + Word::Big => { + let Some(next_g) = self.grapheme_at(pos + 1) else { + return false + }; + next_g.chars().all(char::is_whitespace) + } + Word::Normal => { + let Some(cur_g) = self.grapheme_at(pos) else { + return false + }; + let Some(next_g) = self.grapheme_at(pos + 1) else { + return false + }; + is_other_class_or_ws(cur_g, next_g) + } + } + } + pub fn find_word_pos(&self, word: Word, to: To, dir: Direction) -> Option { + let mut pos = self.cursor; + match word { + Word::Big => { + match dir { + Direction::Forward => { + match to { + To::Start => { + if self.on_start_of_word(word) { + pos += 1; + if pos >= self.byte_len() { + return None + } + } + let ws_pos = self.find_from(pos, |c| CharClass::from(c) == CharClass::Whitespace)?; + let word_start = self.find_from(ws_pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + Some(word_start) + } + To::End => { + match self.on_end_of_word(word) { + true => { + pos += 1; + if pos >= self.byte_len() { + return None + } + let word_start = self.find_from(pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + match self.find_from(word_start, |c| CharClass::from(c) == CharClass::Whitespace) { + Some(n) => Some(n.saturating_sub(1)), // Land on char before whitespace + None => Some(self.byte_len()) // End of buffer + } + } + false => { + match self.find_from(pos, |c| CharClass::from(c) == CharClass::Whitespace) { + Some(n) => Some(n.saturating_sub(1)), // Land on char before whitespace + None => Some(self.byte_len()) // End of buffer + } + } + } + } + } + } + Direction::Backward => { + match to { + To::Start => { + match self.on_start_of_word(word) { + true => { + pos = pos.checked_sub(1)?; + let prev_word_end = self.rfind_from(pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + match self.rfind_from(prev_word_end, |c| CharClass::from(c) == CharClass::Whitespace) { + Some(n) => Some(n + 1), // Land on char after whitespace + None => Some(0) // Start of buffer + } + } + false => { + let last_ws = self.rfind_from(pos, |c| CharClass::from(c) == CharClass::Whitespace)?; + let prev_word_end = self.rfind_from(last_ws, |c| CharClass::from(c) != CharClass::Whitespace)?; + match self.rfind_from(prev_word_end, |c| CharClass::from(c) == CharClass::Whitespace) { + Some(n) => Some(n + 1), // Land on char after whitespace + None => Some(0) // Start of buffer + } + } + } + } + To::End => { + if self.on_end_of_word(word) { + pos = pos.checked_sub(1)?; + } + let last_ws = self.rfind_from(pos, |c| CharClass::from(c) == CharClass::Whitespace)?; + let prev_word_end = self.rfind_from(last_ws, |c| CharClass::from(c) != CharClass::Whitespace)?; + Some(prev_word_end) + } + } + } + } + } + Word::Normal => { + match dir { + Direction::Forward => { + match to { + To::Start => { + if self.on_start_of_word(word) { + pos += 1; + if pos >= self.byte_len() { + return None + } + } + let cur_graph = self.grapheme_at(pos)?; + let diff_class_pos = self.find_from(pos, |c| is_other_class_or_ws(c, cur_graph))?; + if let CharClass::Whitespace = CharClass::from(self.grapheme_at(diff_class_pos)?) { + let non_ws_pos = self.find_from(diff_class_pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + Some(non_ws_pos) + } else { + Some(diff_class_pos) + } + } + To::End => { + match self.on_end_of_word(word) { + true => { + pos += 1; + if pos >= self.byte_len() { + return None + } + let cur_graph = self.grapheme_at(pos)?; + match self.find_from(pos, |c| is_other_class_or_ws(c, cur_graph)) { + Some(n) => { + let cur_graph = self.grapheme_at(n)?; + if CharClass::from(cur_graph) == CharClass::Whitespace { + let Some(non_ws_pos) = self.find_from(n, |c| CharClass::from(c) != CharClass::Whitespace) else { + return Some(self.byte_len()) + }; + let cur_graph = self.grapheme_at(non_ws_pos)?; + let Some(word_end_pos) = self.find_from(non_ws_pos, |c| is_other_class_or_ws(c, cur_graph)) else { + return Some(self.byte_len()) + }; + Some(word_end_pos.saturating_sub(1)) + } else { + Some(pos.saturating_sub(1)) + } + } + None => Some(self.byte_len()) // End of buffer + } + } + false => { + let cur_graph = self.grapheme_at(pos)?; + match self.find_from(pos, |c| is_other_class_or_ws(c, cur_graph)) { + Some(n) => Some(n.saturating_sub(1)), // Land on char before other char class + None => Some(self.byte_len()) // End of buffer + } + } + } + } + } + } + Direction::Backward => { + match to { + To::Start => { + if self.on_start_of_word(word) { + pos = pos.checked_sub(1)?; + } + let cur_graph = self.grapheme_at(pos)?; + let diff_class_pos = self.rfind_from(pos, |c| is_other_class_or_ws(c, cur_graph))?; + if let CharClass::Whitespace = self.grapheme_at(diff_class_pos)?.into() { + let prev_word_end = self.rfind_from(diff_class_pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + let cur_graph = self.grapheme_at(prev_word_end)?; + let Some(prev_word_start) = self.rfind_from(prev_word_end, |c| is_other_class_or_ws(c, cur_graph)) else { + return Some(0) + }; + Some(prev_word_start + 1) + } else { + let cur_graph = self.grapheme_at(diff_class_pos)?; + let Some(prev_word_start) = self.rfind_from(diff_class_pos, |c| is_other_class_or_ws(c, cur_graph)) else { + return Some(0) + }; + Some(prev_word_start + 1) + } + } + To::End => { + if self.on_end_of_word(word) { + pos = pos.checked_sub(1)?; + } + let cur_graph = self.grapheme_at(pos)?; + let diff_class_pos = self.rfind_from(pos, |c|is_other_class_or_ws(c, cur_graph))?; + if let CharClass::Whitespace = self.grapheme_at(diff_class_pos)?.into() { + let prev_word_end = self.rfind_from(diff_class_pos, |c| CharClass::from(c) != CharClass::Whitespace).unwrap_or(0); + Some(prev_word_end) + } else { + Some(diff_class_pos) + } + } + } + } + } + } + } + } + pub fn find bool>(&self, op: F) -> Option { + self.find_from(self.cursor, op) + } + pub fn rfind bool>(&self, op: F) -> Option { + self.rfind_from(self.cursor, op) + } + + /// Find the first grapheme at or after `pos` for which `op` returns true. + /// Returns the byte index of that grapheme in the buffer. + pub fn find_from bool>(&self, pos: usize, op: F) -> Option { + assert!(is_grapheme_boundary(&self.buffer, pos)); + + // Iterate over grapheme indices starting at `pos` + let slice = &self.slice_from(pos); + for (offset, grapheme) in slice.grapheme_indices(true) { + if op(grapheme) { + return Some(pos + offset); + } + } + None + } + /// Find the last grapheme at or before `pos` for which `op` returns true. + /// Returns the byte index of that grapheme in the buffer. + pub fn rfind_from bool>(&self, pos: usize, op: F) -> Option { + assert!(is_grapheme_boundary(&self.buffer, pos)); + + // Iterate grapheme boundaries backward up to pos + let slice = &self.slice_to(pos); + let graphemes = slice.grapheme_indices(true).rev(); + + for (offset, grapheme) in graphemes { + if op(grapheme) { + return Some(offset); + } + } + None } pub fn eval_motion(&self, motion: Motion) -> MotionKind { match motion { - Motion::WholeLine => MotionKind::range(self.cur_line_range()), - Motion::TextObj(text_obj, bound) => { - let range = self.eval_text_obj(text_obj, bound); - let range = mk_range(range.start, range.end); - let cursor = self.cursor(); - if range.start == cursor && range.end == cursor { - MotionKind::Null - } else { - MotionKind::range(range) - } + Motion::WholeLine => { + let (start,end) = self.this_line(); + MotionKind::range(start..=end) } + Motion::TextObj(text_obj, bound) => todo!(), Motion::BeginningOfFirstWord => { - let cursor = self.cursor(); - let line_start = self.backward_until(cursor, |c| c == &TermChar::Newline, true); - let first_print = self.forward_until(line_start, |c| !c.is_whitespace(), true); - MotionKind::To(first_print) + let (start,_) = self.this_line(); + let first_graph_pos = self.find_from(start, |c| CharClass::from(c) != CharClass::Whitespace).unwrap_or(start); + MotionKind::To(first_graph_pos) } - Motion::ToColumn(col) => { - let rng = self.cur_line_range(); - let column = (*rng.start() + (col.saturating_sub(1))).min(*rng.end()); - MotionKind::To(column) + Motion::BeginningOfLine => MotionKind::To(self.this_line().0), + Motion::EndOfLine => MotionKind::To(self.this_line().1), + Motion::BackwardWord(to, word) => { + let Some(pos) = self.find_word_pos(word, to, Direction::Backward) else { + return MotionKind::Null + }; + MotionKind::To(pos) } - Motion::BeginningOfLine => { - let cursor = self.cursor(); - let mut line_start = self.backward_until(cursor, |c| c == &TermChar::Newline, false); - if self.get_char(line_start.saturating_sub(1)).is_some_and(|c| c != &TermChar::Newline) { - line_start = 0; // FIXME: not sure if this logic is correct - } - MotionKind::To(line_start) + Motion::ForwardWord(to, word) => { + let Some(pos) = self.find_word_pos(word, to, Direction::Forward) else { + return MotionKind::Null + }; + MotionKind::To(pos) } - Motion::EndOfLine => { - let cursor = self.cursor(); - let mut line_end = self.forward_until(cursor, |c| c == &TermChar::Newline, false); - // If we didn't actually find a newline, we need to go to the end of the buffer - if self.get_char(line_end + 1).is_some_and(|c| c != &TermChar::Newline) { - line_end = self.buffer.len(); // FIXME: not sure if this logic is correct - } - MotionKind::To(line_end) - } - Motion::BackwardWord(dest, word) => MotionKind::To(self.find_word_pos(word, dest, Direction::Backward)), - Motion::ForwardWord(dest, word) => MotionKind::To(self.find_word_pos(word, dest, Direction::Forward)), Motion::CharSearch(direction, dest, ch) => { - let mut cursor = self.cursor(); - let inclusive = matches!(dest, Dest::On); - - let stop_condition = |c: &TermChar| { - c == &TermChar::Newline || - c == &ch - }; - if self.cursor_char().is_some_and(|c| c == &ch) { - // We are already on the character we are looking for - // Let's nudge the cursor - match direction { - Direction::Backward => cursor = self.cursor().saturating_sub(1), - Direction::Forward => cursor = self.num_or_len(self.cursor() + 1), - } - } - - let stop_pos = match direction { - Direction::Forward => self.forward_until(cursor, stop_condition, inclusive), - Direction::Backward => self.backward_until(cursor, stop_condition, inclusive), - }; - - let found_char = match dest { - Dest::On => self.get_char(stop_pos).is_some_and(|c| c == &ch), - _ => { - match direction { - Direction::Forward => self.get_char(stop_pos + 1).is_some_and(|c| c == &ch), - Direction::Backward => self.get_char(stop_pos.saturating_sub(1)).is_some_and(|c| c == &ch), + match direction { + Direction::Forward => { + let Some(pos) = self.slice_from_cursor().find(ch) else { + return MotionKind::Null + }; + match dest { + Dest::On => MotionKind::To(pos), + Dest::Before => MotionKind::To(pos.saturating_sub(1)), + Dest::After => todo!(), } } - }; + Direction::Backward => { + let Some(pos) = self.slice_to_cursor().rfind(ch) else { + return MotionKind::Null + }; + match dest { + Dest::On => MotionKind::To(pos), + Dest::Before => MotionKind::To(pos + 1), + Dest::After => todo!(), + } + } + } - if found_char { - MotionKind::To(stop_pos) - } else { - MotionKind::Null - } - } - Motion::Range(s, e) => { - if self.validate_range(&(s..e)) { - let range = mk_range(s, e); - MotionKind::range(range) - } else { - MotionKind::Null - } } Motion::BackwardChar => MotionKind::Backward(1), Motion::ForwardChar => MotionKind::Forward(1), - Motion::LineUp => { - if self.on_first_line() { - return MotionKind::Null // TODO: implement history scrolling here - } - let col = self.cur_line_col(); - let cursor = self.cursor(); - let mut ln_start = self.backward_until(cursor, |c| c.matches("\n"), true); - let ln_end = ln_start.saturating_sub(1); - ln_start = self.backward_until(ln_end, |c| c.matches("\n"), true); - let new_pos = (ln_start + col).min(ln_end); - MotionKind::To(new_pos) - } + Motion::LineUp => todo!(), Motion::LineDown => todo!(), - Motion::WholeBuffer => MotionKind::Range(0..self.buffer.len().saturating_sub(1)), + Motion::WholeBuffer => todo!(), Motion::BeginningOfBuffer => MotionKind::To(0), - Motion::EndOfBuffer => MotionKind::To(self.buffer.len().saturating_sub(1)), - Motion::Null => MotionKind::Null, - _ => unreachable!(), + Motion::EndOfBuffer => MotionKind::To(self.byte_len()), + Motion::ToColumn(n) => { + let (start,end) = self.this_line(); + let pos = start + n; + if pos > end { + MotionKind::To(end) + } else { + MotionKind::To(pos) + } + } + Motion::Range(_, _) => todo!(), + Motion::Builder(motion_builder) => todo!(), + Motion::RepeatMotion => todo!(), + Motion::RepeatMotionRev => todo!(), + Motion::Null => todo!(), } } pub fn exec_verb(&mut self, verb: Verb, motion: MotionKind, register: RegisterName) -> ShResult<()> { match verb { Verb::Change | Verb::Delete => { - if self.buffer.is_empty() { - return Ok(()) - } let deleted; match motion { MotionKind::Forward(n) => { - let fwd = self.num_or_len(self.cursor() + n); - let cursor = self.cursor(); - deleted = self.buffer.drain(cursor..=fwd).collect::(); + let Some(pos) = self.next_pos(n) else { + return Ok(()) + }; + let range = self.cursor..pos; + assert!(range.end < self.byte_len()); + deleted = self.buffer.drain(range); } - MotionKind::To(pos) => { - let range = mk_range(self.cursor(), pos); - deleted = self.buffer.drain(range.clone()).collect::(); - self.apply_motion(MotionKind::To(range.start)); + MotionKind::To(n) => { + let range = mk_range(self.cursor, n); + assert!(range.end < self.byte_len()); + deleted = self.buffer.drain(range); } MotionKind::Backward(n) => { - let back = self.cursor.saturating_sub(n); - let cursor = self.cursor(); - deleted = self.buffer.drain(back..cursor).collect::(); - self.apply_motion(MotionKind::To(back)); + let Some(back) = self.prev_pos(n) else { + return Ok(()) + }; + let range = back..self.cursor; + dbg!(&range); + deleted = self.buffer.drain(range); } - MotionKind::Range(r) => { - deleted = self.buffer.drain(r.clone()).collect::(); - self.apply_motion(MotionKind::To(r.start)); + MotionKind::Range(range) => { + deleted = self.buffer.drain(range.0..range.1); } - MotionKind::Null => return Ok(()) - } - register.write_to_register(deleted); - } - Verb::DeleteChar(anchor) => { - if self.buffer.is_empty() { - return Ok(()) - } - match anchor { - Anchor::After => { - let pos = self.cursor(); - self.buffer.remove(pos); - } - Anchor::Before => { - let pos = self.cursor.saturating_sub(1); - self.buffer.remove(pos); - self.cursor = self.cursor.saturating_sub(1); - } - } - } - Verb::Yank => { - let yanked; - match motion { - MotionKind::Forward(n) => { - let fwd = self.num_or_len(self.cursor() + n); - let cursor = self.cursor(); - yanked = self.buffer[cursor..=fwd] - .iter() - .cloned() - .collect::(); - } - MotionKind::To(pos) => { - let range = mk_range(self.cursor(), pos); - yanked = self.buffer[range.clone()] - .iter() - .cloned() - .collect::(); - self.apply_motion(MotionKind::To(range.start)); - } - MotionKind::Backward(n) => { - let back = self.cursor.saturating_sub(n); - let cursor = self.cursor(); - yanked = self.buffer[back..cursor] - .iter() - .cloned() - .collect::(); - self.apply_motion(MotionKind::To(back)); - } - MotionKind::Range(r) => { - yanked = self.buffer[r.start..r.end] - .iter() - .cloned() - .collect::(); - self.apply_motion(MotionKind::To(r.start)); - } - MotionKind::ToScreenPos(pos) => todo!(), - MotionKind::Null => return Ok(()) - } - register.write_to_register(yanked); - } - Verb::ReplaceChar(ch) => { - let cursor = self.cursor(); - if let Some(c) = self.buffer.get_mut(cursor) { - let mut tc = TermChar::from(ch); - std::mem::swap(c, &mut tc) + MotionKind::Line(n) => { + let (start,end) = match n.cmp(&0) { + Ordering::Less => self.select_lines_up(n.abs() as usize), + Ordering::Equal => self.this_line(), + Ordering::Greater => self.select_lines_down(n as usize) + }; + let range = match verb { + Verb::Change => start..end, + Verb::Delete => start..end.saturating_add(1), + _ => unreachable!() + }; + deleted = self.buffer.drain(range); + } + MotionKind::ToLine(n) => { + let (start,end) = self.select_lines_to(n); + let range = match verb { + Verb::Change => start..end, + Verb::Delete => start..end.saturating_add(1), + _ => unreachable!() + }; + deleted = self.buffer.drain(range); + } + MotionKind::Null => return Ok(()), + MotionKind::ToScreenPos(n) => todo!(), } + register.write_to_register(deleted.collect()); self.apply_motion(motion); } + Verb::DeleteChar(anchor) => { + match anchor { + Anchor::After => { + if self.grapheme_at(self.cursor).is_some() { + self.buffer.remove(self.cursor); + } + } + Anchor::Before => { + if self.grapheme_at(self.cursor.saturating_sub(1)).is_some() { + self.buffer.remove(self.cursor.saturating_sub(1)); + } + } + } + } + Verb::Yank => todo!(), + Verb::ReplaceChar(_) => todo!(), Verb::Substitute => todo!(), Verb::ToggleCase => todo!(), Verb::Complete => todo!(), Verb::CompleteBackward => todo!(), - Verb::Undo => { - let Some(undo) = self.undo_stack.pop() else { - return Ok(()) - }; - flog!(DEBUG, undo); - let Edit { pos, cursor_pos, old, new } = undo; - let start = pos; - let end = pos + new.len(); - self.buffer.0.splice(start..end, old.0.clone()); - let cur_pos = self.cursor(); - self.cursor = cursor_pos; - let redo = Edit { pos, cursor_pos: cur_pos, old: new, new: old }; - flog!(DEBUG, redo); - self.redo_stack.push(redo); - } - Verb::Redo => { - let Some(Edit { pos, cursor_pos, old, new }) = self.redo_stack.pop() else { - return Ok(()) - }; - let start = pos; - let end = pos + new.len(); - self.buffer.0.splice(start..end, old.0.clone()); - let cur_pos = self.cursor(); - self.cursor = cursor_pos; - self.undo_stack.push(Edit { pos, cursor_pos: cur_pos, old: new, new: old }); - } + Verb::Undo => todo!(), + Verb::Redo => todo!(), Verb::RepeatLast => todo!(), - Verb::Put(anchor) => { - if let Some(charbuf) = register.read_from_register() { - let chars = charbuf.0.into_iter(); - if anchor == Anchor::Before { - self.cursor_back(1); - } - for char in chars { + Verb::Put(anchor) => todo!(), + Verb::InsertModeLineBreak(anchor) => { + match anchor { + Anchor::After => { + let (_,end) = self.this_line(); + self.cursor = end; + self.insert('\n'); self.cursor_fwd(1); - self.insert_at_cursor(char); + } + Anchor::Before => { + let (start,_) = self.this_line(); + self.cursor = start; + self.insert('\n'); } } } Verb::JoinLines => todo!(), Verb::InsertChar(ch) => { - self.insert_at_cursor(ch); + self.insert(ch); self.apply_motion(motion); } Verb::Insert(_) => todo!(), Verb::Breakline(anchor) => todo!(), Verb::Indent => todo!(), Verb::Dedent => todo!(), + Verb::Equalize => todo!(), Verb::AcceptLine => todo!(), - Verb::EndOfFile => { - if self.buffer.is_empty() { - sh_quit(0) - } else { - self.buffer.clear(); - self.cursor = 0; - } - } - Verb::InsertModeLineBreak(anchor) => { - match anchor { - Anchor::After => { - let rng = self.cur_line_range(); - self.apply_motion(MotionKind::To(self.num_or_len(rng.end() + 1))); - self.insert_at_cursor('\n'.into()); - self.apply_motion(MotionKind::Forward(1)); - } - Anchor::Before => todo!(), - } - } - Verb::Equalize => { - } + Verb::Builder(verb_builder) => todo!(), + Verb::EndOfFile => todo!(), + + Verb::OverwriteMode | Verb::InsertMode | Verb::NormalMode | - Verb::VisualMode | - Verb::OverwriteMode => { + Verb::VisualMode => { + /* Already handled */ self.apply_motion(motion); } } Ok(()) } pub fn apply_motion(&mut self, motion: MotionKind) { + dbg!(&motion); match motion { - MotionKind::Forward(n) => self.cursor_fwd(n), - MotionKind::To(pos) => self.cursor_to(pos), - MotionKind::Backward(n) => self.cursor_back(n), - MotionKind::Range(r) => self.cursor_to(r.start), // TODO: not sure if this is correct in every case + MotionKind::Forward(n) => { + for _ in 0..n { + if !self.cursor_fwd(1) { + break + } + } + } + MotionKind::Backward(n) => { + for _ in 0..n { + if !self.cursor_back(1) { + break + } + } + } + MotionKind::To(n) => { + assert!((0..=self.byte_len()).contains(&n)); + self.cursor = n + } + MotionKind::Range(range) => { + assert!((0..self.byte_len()).contains(&range.0)); + if self.cursor != range.0 { + self.cursor = range.0 + } + } + MotionKind::Line(n) => { + match n.cmp(&0) { + Ordering::Equal => { + let (start,_) = self.this_line(); + self.cursor = start; + } + Ordering::Less => { + let (start,_) = self.select_lines_up(n.abs() as usize); + self.cursor = start; + } + Ordering::Greater => { + let (_,end) = self.select_lines_down(n.abs() as usize); + self.cursor = end.saturating_sub(1); + let (start,_) = self.this_line(); + self.cursor = start; + } + } + } + MotionKind::ToLine(n) => { + let Some((start,_)) = self.select_line(n) else { + return + }; + self.cursor = start; + } MotionKind::Null => { /* Pass */ } + MotionKind::ToScreenPos(_) => todo!(), } } - pub fn handle_edit(&mut self, old: TermCharBuf, new: TermCharBuf, curs_pos: usize) { + pub fn handle_edit(&mut self, old: String, new: String, curs_pos: usize) { if self.merge_edit { - let mut diff = Edit::diff(old, new, curs_pos); + let diff = Edit::diff(&old, &new, curs_pos); let Some(mut edit) = self.undo_stack.pop() else { self.undo_stack.push(diff); return }; - edit.new.append(&mut diff.new); + edit.new.push_str(&diff.new); self.undo_stack.push(edit); } else { - let diff = Edit::diff(old, new, curs_pos); + let diff = Edit::diff(&old, &new, curs_pos); self.undo_stack.push(diff); } } @@ -1193,7 +1071,7 @@ impl LineBuf { let motion_count = motion.as_ref().map(|m| m.0); let before = self.buffer.clone(); - let cursor_pos = self.cursor(); + let cursor_pos = self.cursor; for _ in 0..verb_count.unwrap_or(1) { for _ in 0..motion_count.unwrap_or(1) { @@ -1215,7 +1093,7 @@ impl LineBuf { self.redo_stack.clear(); } - if before.0 != after.0 && !is_undo_op { + if before != after && !is_undo_op { self.handle_edit(before, after, cursor_pos); } @@ -1262,6 +1140,10 @@ pub fn strip_ansi_codes_and_escapes(s: &str) -> String { out } +pub fn is_grapheme_boundary(s: &str, pos: usize) -> bool { + s.is_char_boundary(pos) && s.grapheme_indices(true).any(|(i,_)| i == pos) +} + fn mk_range(a: usize, b: usize) -> Range { std::cmp::min(a, b)..std::cmp::max(a, b) } diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 320ecfa..993e1b0 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -1,6 +1,6 @@ -use std::{collections::HashMap, sync::Mutex}; +use std::time::Duration; -use linebuf::{strip_ansi_codes_and_escapes, LineBuf, TermCharBuf}; +use linebuf::{strip_ansi_codes_and_escapes, LineBuf}; use mode::{CmdReplay, ViInsert, ViMode, ViNormal}; use term::Terminal; use unicode_width::UnicodeWidthStr; @@ -16,6 +16,11 @@ pub mod vicmd; pub mod mode; pub mod register; +/// Unified interface for different line editing methods +pub trait Readline { + fn readline(&mut self) -> ShResult; +} + pub struct FernVi { term: Terminal, line: LineBuf, @@ -25,91 +30,29 @@ pub struct FernVi { last_movement: Option, } -impl FernVi { - pub fn new(prompt: Option) -> Self { - let prompt = prompt.unwrap_or("$ ".styled(Style::Green | Style::Bold)); - let line = LineBuf::new().with_initial("The quick brown fox jumps over the lazy dog");//\nThe quick brown fox jumps over the lazy dog\nThe quick brown fox jumps over the lazy dog\n"); - Self { - term: Terminal::new(), - line, - prompt, - mode: Box::new(ViInsert::new()), - last_action: None, - last_movement: None, - } - } - pub fn calculate_prompt_offset(&self) -> usize { - if self.prompt.ends_with('\n') { - return 0 - } - strip_ansi_codes_and_escapes(self.prompt.lines().last().unwrap_or_default()).width() - } - pub fn clear_line(&self) { - let prompt_lines = self.prompt.lines().count(); - let last_line_len = strip_ansi_codes_and_escapes(self.prompt.lines().last().unwrap_or_default()).width(); - let buf_lines = if self.prompt.ends_with('\n') { - self.line.count_lines(last_line_len) - } else { - // The prompt does not end with a newline, so one of the buffer's lines overlaps with it - self.line.count_lines(last_line_len).saturating_sub(1) - }; - let total = prompt_lines + buf_lines; - self.term.write_bytes(b"\r\n"); - self.term.write_bytes(format!("\r\x1b[{total}B").as_bytes()); - for _ in 0..total { - self.term.write_bytes(b"\r\x1b[2K\x1b[1A"); - } - self.term.write_bytes(b"\r\x1b[2K"); - } - pub fn print_buf(&self, refresh: bool) { - if refresh { - self.clear_line() - } - let mut prompt_lines = self.prompt.lines().peekable(); - let mut last_line_len = 0; - let lines = self.line.split_lines(); - while let Some(line) = prompt_lines.next() { - if prompt_lines.peek().is_none() { - last_line_len = strip_ansi_codes_and_escapes(line).width(); - self.term.write(line); - } else { +impl Readline for FernVi { + fn readline(&mut self) -> ShResult { + /* + self.term.writeln("This is a line!"); + self.term.writeln("This is a line!"); + self.term.writeln("This is a line!"); + let prompt_thing = "prompt thing -> "; + self.term.write(prompt_thing); + let line = "And another!"; + let mut iters: usize = 0; + let mut newlines_written = 0; + loop { + iters += 1; + for i in 0..iters { self.term.writeln(line); } + std::thread::sleep(Duration::from_secs(1)); + self.clear_lines(iters,prompt_thing.len() + 1); } - let mut lines_iter = lines.into_iter().peekable(); - - let pos = self.term.cursor_pos(); - while let Some(line) = lines_iter.next() { - if lines_iter.peek().is_some() { - self.term.writeln(&line); - } else { - self.term.write(&line); - } - } - self.term.move_cursor_to(pos); - - let (x, y) = self.line.cursor_display_coords(Some(last_line_len)); - - if y > 0 { - self.term.write(&format!("\r\x1b[{}B", y)); - } - - - let cursor_x = if y == 0 { x + last_line_len } else { x }; - - if cursor_x > 0 { - self.term.write(&format!("\r\x1b[{}C", cursor_x)); - } - self.term.write(&self.mode.cursor_style()); - } - pub fn readline(&mut self) -> ShResult { - self.line.set_first_line_offset(self.calculate_prompt_offset()); - let dims = self.term.get_dimensions()?; - self.line.update_term_dims(dims.0, dims.1); - self.print_buf(false); + panic!() + */ + self.print_buf(false)?; loop { - let dims = self.term.get_dimensions()?; - self.line.update_term_dims(dims.0, dims.1); let key = self.term.read_key(); let Some(cmd) = self.mode.handle_key(key) else { @@ -121,9 +64,45 @@ impl FernVi { } self.exec_cmd(cmd.clone())?; - self.print_buf(true); + self.print_buf(true)?; } } +} + +impl FernVi { + pub fn new(prompt: Option) -> Self { + let prompt = prompt.unwrap_or("$ ".styled(Style::Green | Style::Bold)); + let line = LineBuf::new().with_initial("The quick brown fox jumps over the lazy dog");//\nThe quick brown fox jumps over the lazy dog\nThe quick brown fox jumps over the lazy dog\n"); + let term = Terminal::new(); + Self { + term, + line, + prompt, + mode: Box::new(ViInsert::new()), + last_action: None, + last_movement: None, + } + } + pub fn print_buf(&mut self, refresh: bool) -> ShResult<()> { + let (_,width) = self.term.get_dimensions()?; + if refresh { + self.term.unwrite()?; + } + let offset = self.calculate_prompt_offset(); + let mut line_buf = self.prompt.clone(); + line_buf.push_str(self.line.as_str()); + + self.term.recorded_write(&line_buf, offset)?; + self.term.position_cursor(self.line.cursor_display_coords(offset,width))?; + + Ok(()) + } + pub fn calculate_prompt_offset(&self) -> usize { + if self.prompt.ends_with('\n') { + return 0 + } + strip_ansi_codes_and_escapes(self.prompt.lines().last().unwrap_or_default()).width() + 1 // 1 indexed + } pub fn exec_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { if cmd.is_mode_transition() { let count = cmd.verb_count(); diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs index 35806aa..9021275 100644 --- a/src/prompt/readline/mode.rs +++ b/src/prompt/readline/mode.rs @@ -4,7 +4,6 @@ use std::str::Chars; use nix::NixPath; use super::keys::{KeyEvent as E, KeyCode as K, ModKeys as M}; -use super::linebuf::TermChar; use super::vicmd::{Anchor, Bound, Dest, Direction, Motion, MotionBuilder, MotionCmd, RegisterName, TextObj, To, Verb, VerbBuilder, VerbCmd, ViCmd, Word}; use crate::prelude::*; @@ -72,14 +71,8 @@ impl ViInsert { impl ViMode for ViInsert { fn handle_key(&mut self, key: E) -> Option { match key { - E(K::Grapheme(ch), M::NONE) => { - let ch = TermChar::from(ch); - self.pending_cmd.set_verb(VerbCmd(1,Verb::InsertChar(ch))); - self.pending_cmd.set_motion(MotionCmd(1,Motion::ForwardChar)); - self.register_and_return() - } E(K::Char(ch), M::NONE) => { - self.pending_cmd.set_verb(VerbCmd(1,Verb::InsertChar(TermChar::from(ch)))); + self.pending_cmd.set_verb(VerbCmd(1,Verb::InsertChar(ch))); self.pending_cmd.set_motion(MotionCmd(1,Motion::ForwardChar)); self.register_and_return() } diff --git a/src/prompt/readline/register.rs b/src/prompt/readline/register.rs index f5eeabe..5fdc12d 100644 --- a/src/prompt/readline/register.rs +++ b/src/prompt/readline/register.rs @@ -1,20 +1,18 @@ use std::sync::Mutex; -use super::linebuf::TermCharBuf; - pub static REGISTERS: Mutex = Mutex::new(Registers::new()); -pub fn read_register(ch: Option) -> Option { +pub fn read_register(ch: Option) -> Option { let lock = REGISTERS.lock().unwrap(); lock.get_reg(ch).map(|r| r.buf().clone()) } -pub fn write_register(ch: Option, buf: TermCharBuf) { +pub fn write_register(ch: Option, buf: String) { let mut lock = REGISTERS.lock().unwrap(); if let Some(r) = lock.get_reg_mut(ch) { r.write(buf) } } -pub fn append_register(ch: Option, buf: TermCharBuf) { +pub fn append_register(ch: Option, buf: String) { let mut lock = REGISTERS.lock().unwrap(); if let Some(r) = lock.get_reg_mut(ch) { r.append(buf) } } @@ -53,33 +51,33 @@ pub struct Registers { impl Registers { pub const fn new() -> Self { Self { - default: Register(TermCharBuf(vec![])), - a: Register(TermCharBuf(vec![])), - b: Register(TermCharBuf(vec![])), - c: Register(TermCharBuf(vec![])), - d: Register(TermCharBuf(vec![])), - e: Register(TermCharBuf(vec![])), - f: Register(TermCharBuf(vec![])), - g: Register(TermCharBuf(vec![])), - h: Register(TermCharBuf(vec![])), - i: Register(TermCharBuf(vec![])), - j: Register(TermCharBuf(vec![])), - k: Register(TermCharBuf(vec![])), - l: Register(TermCharBuf(vec![])), - m: Register(TermCharBuf(vec![])), - n: Register(TermCharBuf(vec![])), - o: Register(TermCharBuf(vec![])), - p: Register(TermCharBuf(vec![])), - q: Register(TermCharBuf(vec![])), - r: Register(TermCharBuf(vec![])), - s: Register(TermCharBuf(vec![])), - t: Register(TermCharBuf(vec![])), - u: Register(TermCharBuf(vec![])), - v: Register(TermCharBuf(vec![])), - w: Register(TermCharBuf(vec![])), - x: Register(TermCharBuf(vec![])), - y: Register(TermCharBuf(vec![])), - z: Register(TermCharBuf(vec![])), + default: Register(String::new()), + a: Register(String::new()), + b: Register(String::new()), + c: Register(String::new()), + d: Register(String::new()), + e: Register(String::new()), + f: Register(String::new()), + g: Register(String::new()), + h: Register(String::new()), + i: Register(String::new()), + j: Register(String::new()), + k: Register(String::new()), + l: Register(String::new()), + m: Register(String::new()), + n: Register(String::new()), + o: Register(String::new()), + p: Register(String::new()), + q: Register(String::new()), + r: Register(String::new()), + s: Register(String::new()), + t: Register(String::new()), + u: Register(String::new()), + v: Register(String::new()), + w: Register(String::new()), + x: Register(String::new()), + y: Register(String::new()), + z: Register(String::new()), } } pub fn get_reg(&self, ch: Option) -> Option<&Register> { @@ -153,17 +151,16 @@ impl Registers { } #[derive(Clone,Default,Debug)] -pub struct Register(TermCharBuf); - +pub struct Register(String); impl Register { - pub fn buf(&self) -> &TermCharBuf { + pub fn buf(&self) -> &String { &self.0 } - pub fn write(&mut self, buf: TermCharBuf) { + pub fn write(&mut self, buf: String) { self.0 = buf } - pub fn append(&mut self, mut buf: TermCharBuf) { - self.0.0.append(&mut buf.0) + pub fn append(&mut self, buf: String) { + self.0.push_str(&buf) } pub fn clear(&mut self) { self.0.clear() diff --git a/src/prompt/readline/term.rs b/src/prompt/readline/term.rs index 67bf0d8..bc1a2b2 100644 --- a/src/prompt/readline/term.rs +++ b/src/prompt/readline/term.rs @@ -1,6 +1,7 @@ use std::{os::fd::{BorrowedFd, RawFd}, thread::sleep, time::{Duration, Instant}}; use nix::{errno::Errno, fcntl::{fcntl, FcntlArg, OFlag}, libc::{self, STDIN_FILENO}, sys::termios, unistd::{isatty, read, write}}; use nix::libc::{winsize, TIOCGWINSZ}; +use unicode_width::UnicodeWidthChar; use std::mem::zeroed; use std::io; @@ -8,10 +9,20 @@ use crate::libsh::error::ShResult; use super::keys::{KeyCode, KeyEvent, ModKeys}; +#[derive(Default,Debug)] +struct WriteMap { + lines: usize, + cols: usize, + offset: usize +} + #[derive(Debug)] pub struct Terminal { stdin: RawFd, stdout: RawFd, + recording: bool, + write_records: WriteMap, + cursor_records: WriteMap } impl Terminal { @@ -20,6 +31,13 @@ impl Terminal { Self { stdin: STDIN_FILENO, stdout: 1, + recording: false, + // Records for buffer writes + // Used to find the start of the buffer + write_records: WriteMap::default(), + // Records for cursor movements after writes + // Used to find the end of the buffer + cursor_records: WriteMap::default(), } } @@ -53,15 +71,24 @@ impl Terminal { Ok((ws.ws_row as usize, ws.ws_col as usize)) } - pub fn save_cursor_pos(&self) { + pub fn start_recording(&mut self, offset: usize) { + self.recording = true; + self.write_records.offset = offset; + } + + pub fn stop_recording(&mut self) { + self.recording = false; + } + + pub fn save_cursor_pos(&mut self) { self.write("\x1b[s") } - pub fn restore_cursor_pos(&self) { + pub fn restore_cursor_pos(&mut self) { self.write("\x1b[u") } - pub fn move_cursor_to(&self, (row,col): (usize,usize)) { + pub fn move_cursor_to(&mut self, (row,col): (usize,usize)) { self.write(&format!("\x1b[{row};{col}H",)) } @@ -118,7 +145,7 @@ impl Terminal { return n } Ok(_) => {} - Err(e) if e == Errno::EAGAIN => {} + Err(Errno::EAGAIN) => {} Err(e) => panic!("nonblocking read failed: {e}") } @@ -142,23 +169,126 @@ impl Terminal { fcntl(self.stdin, FcntlArg::F_SETFL(new_flags)).unwrap(); } - pub fn write_bytes(&self, buf: &[u8]) { - Self::with_raw_mode(|| { - write(unsafe{BorrowedFd::borrow_raw(self.stdout)}, buf).expect("Failed to write to stdout"); - }); + pub fn reset_records(&mut self) { + self.write_records = Default::default(); + self.cursor_records = Default::default(); + } + + pub fn recorded_write(&mut self, buf: &str, offset: usize) -> ShResult<()> { + self.start_recording(offset); + self.write(buf); + self.stop_recording(); + Ok(()) + } + + pub fn unwrite(&mut self) -> ShResult<()> { + self.unposition_cursor()?; + let WriteMap { lines, cols, offset } = self.write_records; + for _ in 0..lines { + self.write("\x1b[2K\x1b[A") + } + let col = offset; + self.write(&format!("\x1b[{col}G\x1b[0K")); + self.reset_records(); + Ok(()) + } + + pub fn position_cursor(&mut self, (lines,col): (usize,usize)) -> ShResult<()> { + dbg!(self.cursor_pos()); + self.cursor_records.lines = lines; + self.cursor_records.cols = col; + self.cursor_records.offset = self.cursor_pos().1; + + for _ in 0..lines { + self.write("\x1b[A") + } + + self.write(&format!("\x1b[{col}G")); + + dbg!("done moving"); + dbg!(self.cursor_pos()); + + Ok(()) + } + + pub fn unposition_cursor(&mut self) ->ShResult<()> { + dbg!(self.cursor_pos()); + let WriteMap { lines, cols, offset } = self.cursor_records; + + for _ in 0..lines { + self.write("\x1b[B") + } + + self.write(&format!("\x1b[{offset}G")); + + dbg!("done moving back"); + dbg!(self.cursor_pos()); + + Ok(()) + } + + pub fn write_bytes(&mut self, buf: &[u8]) { + if self.recording { + let (_, width) = self.get_dimensions().unwrap(); + let mut bytes = buf.iter().map(|&b| b as char).peekable(); + while let Some(ch) = bytes.next() { + match ch { + '\n' => { + self.write_records.lines += 1; + self.write_records.cols = 0; + } + '\r' => { + self.write_records.cols = 0; + } + // Consume escape sequences + '\x1b' if bytes.peek() == Some(&'[') => { + bytes.next(); + while let Some(&ch) = bytes.peek() { + if ch.is_ascii_alphabetic() { + bytes.next(); + break + } else { + bytes.next(); + } + } + } + '\t' => { + let tab_size = 8; + let next_tab = tab_size - (self.write_records.cols % tab_size); + self.write_records.cols += next_tab; + if self.write_records.cols >= width { + self.write_records.lines += 1; + self.write_records.cols = 0; + } + } + _ if ch.is_control() => { + // ignore control characters for visual width + } + _ => { + let ch_width = ch.width().unwrap_or(0); + if self.write_records.cols + ch_width > width { + self.write_records.lines += 1; + self.write_records.cols = 0; + } + self.write_records.cols += ch_width; + } + } + } + } + write(unsafe { BorrowedFd::borrow_raw(self.stdout) }, buf).expect("Failed to write to stdout"); } - pub fn write(&self, s: &str) { + pub fn write(&mut self, s: &str) { self.write_bytes(s.as_bytes()); } - pub fn writeln(&self, s: &str) { + pub fn writeln(&mut self, s: &str) { self.write(s); - self.write_bytes(b"\r\n"); + self.write_bytes(b"\n"); } - pub fn clear(&self) { + pub fn clear(&mut self) { self.write_bytes(b"\x1b[2J\x1b[H"); } @@ -216,7 +346,7 @@ impl Terminal { KeyEvent(KeyCode::Null, ModKeys::empty()) } - pub fn cursor_pos(&self) -> (usize, usize) { + pub fn cursor_pos(&mut self) -> (usize, usize) { self.write("\x1b[6n"); let mut buf = [0u8;32]; let n = self.read_byte(&mut buf); diff --git a/src/prompt/readline/vicmd.rs b/src/prompt/readline/vicmd.rs index f117ec3..8325235 100644 --- a/src/prompt/readline/vicmd.rs +++ b/src/prompt/readline/vicmd.rs @@ -1,4 +1,4 @@ -use super::{linebuf::{TermChar, TermCharBuf}, register::{append_register, read_register, write_register}}; +use super::register::{append_register, read_register, write_register}; #[derive(Clone,Copy,Debug)] pub struct RegisterName { @@ -30,14 +30,14 @@ impl RegisterName { pub fn count(&self) -> usize { self.count } - pub fn write_to_register(&self, buf: TermCharBuf) { + pub fn write_to_register(&self, buf: String) { if self.append { append_register(self.name, buf); } else { write_register(self.name, buf); } } - pub fn read_from_register(&self) -> Option { + pub fn read_from_register(&self) -> Option { read_register(self.name) } } @@ -153,7 +153,7 @@ pub enum Verb { NormalMode, VisualMode, JoinLines, - InsertChar(TermChar), + InsertChar(char), Insert(String), Breakline(Anchor), Indent, @@ -237,7 +237,7 @@ pub enum Motion { /// forward-word, vi-end-word, vi-next-word ForwardWord(To, Word), // Forward until start/end of word /// character-search, character-search-backward, vi-char-search - CharSearch(Direction,Dest,TermChar), + CharSearch(Direction,Dest,char), /// backward-char BackwardChar, /// forward-char diff --git a/src/shopt.rs b/src/shopt.rs index e5e7480..3163f94 100644 --- a/src/shopt.rs +++ b/src/shopt.rs @@ -38,8 +38,9 @@ impl Display for FernBellStyle { } } -#[derive(Clone, Copy, Debug)] +#[derive(Default, Clone, Copy, Debug)] pub enum FernEditMode { + #[default] Vi, Emacs } From 0e95e006d8ba84ea1ad1f40bf77d948d5b2fcebd Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Tue, 27 May 2025 03:32:08 -0400 Subject: [PATCH 15/19] implemented proper cursor placement for line editor --- src/prompt/readline/linebuf.rs | 88 +++++++++++++++++++++++++++------- src/prompt/readline/mod.rs | 4 +- src/prompt/readline/mode.rs | 8 ++++ src/prompt/readline/vicmd.rs | 3 ++ 4 files changed, 84 insertions(+), 19 deletions(-) diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index 0c1de60..2746fb9 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -142,6 +142,7 @@ pub struct LineBuf { cursor: usize, clamp_cursor: bool, first_line_offset: usize, + saved_col: Option, merge_edit: bool, undo_stack: Vec, redo_stack: Vec, @@ -155,6 +156,9 @@ impl LineBuf { self.buffer = initial.to_string(); self } + pub fn set_first_line_offset(&mut self, offset: usize) { + self.first_line_offset = offset + } pub fn as_str(&self) -> &str { &self.buffer } @@ -177,7 +181,7 @@ impl LineBuf { // Insert mode does let you set on the edge though, so that you can append new characters // This method is used in Normal mode dbg!("clamping"); - if self.cursor == self.byte_len() { + if self.cursor == self.byte_len() || self.grapheme_at_cursor() == Some("\n") { self.cursor_back(1); } } @@ -370,12 +374,12 @@ impl LineBuf { } (lines,col) } - pub fn cursor_display_coords(&self, first_ln_offset: usize, term_width: usize) -> (usize,usize) { + pub fn cursor_display_coords(&self, term_width: usize) -> (usize,usize) { let (d_line,mut d_col) = self.display_coords(term_width); - let line = self.count_display_lines(first_ln_offset, term_width) - d_line; + let line = self.count_display_lines(self.first_line_offset, term_width) - d_line; if line == self.count_lines() { - d_col += first_ln_offset; + d_col += self.first_line_offset; } (line,d_col) @@ -409,6 +413,40 @@ impl LineBuf { let end = self.end_of_line(); self.move_to(end) } + pub fn find_prev_line_pos(&mut self) -> Option { + if self.start_of_line() == 0 { + return None + }; + let mut col = self.saved_col.unwrap_or(self.cursor_column()); + let line = self.line_no(); + if line == 1 { + col = col.saturating_sub(self.first_line_offset.saturating_sub(1)) + } + if self.saved_col.is_none() { + self.saved_col = Some(col); + } + let (start,end) = self.select_line(line - 1).unwrap(); + Some((start + col).min(end.saturating_sub(1))) + } + pub fn find_next_line_pos(&mut self) -> Option { + if self.end_of_line() == self.byte_len() { + return None + }; + let mut col = self.saved_col.unwrap_or(self.cursor_column()); + let line = self.line_no(); + if line == 0 { + col += self.first_line_offset.saturating_sub(1); + } + if self.saved_col.is_none() { + self.saved_col = Some(col); + } + let (start,end) = self.select_line(line + 1).unwrap(); + Some((start + col).min(end.saturating_sub(1))) + } + pub fn cursor_column(&self) -> usize { + let line_start = self.start_of_line(); + self.buffer[line_start..self.cursor].graphemes(true).count() + } pub fn start_of_line(&self) -> usize { if let Some(i) = self.slice_to_cursor().rfind('\n') { i + 1 // Land on start of this line, instead of the end of the last one @@ -788,7 +826,7 @@ impl LineBuf { } None } - pub fn eval_motion(&self, motion: Motion) -> MotionKind { + pub fn eval_motion(&mut self, motion: Motion) -> MotionKind { match motion { Motion::WholeLine => { let (start,end) = self.this_line(); @@ -841,8 +879,18 @@ impl LineBuf { } Motion::BackwardChar => MotionKind::Backward(1), Motion::ForwardChar => MotionKind::Forward(1), - Motion::LineUp => todo!(), - Motion::LineDown => todo!(), + Motion::LineUp => { + match self.find_prev_line_pos() { + None => MotionKind::Null, + Some(pos) => MotionKind::To(pos) + } + } + Motion::LineDown => { + match self.find_next_line_pos() { + None => MotionKind::Null, + Some(pos) => MotionKind::To(pos) + } + } Motion::WholeBuffer => todo!(), Motion::BeginningOfBuffer => MotionKind::To(0), Motion::EndOfBuffer => MotionKind::To(self.byte_len()), @@ -856,7 +904,7 @@ impl LineBuf { } } Motion::Range(_, _) => todo!(), - Motion::Builder(motion_builder) => todo!(), + Motion::Builder(_) => todo!(), Motion::RepeatMotion => todo!(), Motion::RepeatMotionRev => todo!(), Motion::Null => todo!(), @@ -866,20 +914,19 @@ impl LineBuf { match verb { Verb::Change | Verb::Delete => { - let deleted; - match motion { + let deleted = match motion { MotionKind::Forward(n) => { let Some(pos) = self.next_pos(n) else { return Ok(()) }; let range = self.cursor..pos; assert!(range.end < self.byte_len()); - deleted = self.buffer.drain(range); + self.buffer.drain(range) } MotionKind::To(n) => { let range = mk_range(self.cursor, n); assert!(range.end < self.byte_len()); - deleted = self.buffer.drain(range); + self.buffer.drain(range) } MotionKind::Backward(n) => { let Some(back) = self.prev_pos(n) else { @@ -887,14 +934,14 @@ impl LineBuf { }; let range = back..self.cursor; dbg!(&range); - deleted = self.buffer.drain(range); + self.buffer.drain(range) } MotionKind::Range(range) => { - deleted = self.buffer.drain(range.0..range.1); + self.buffer.drain(range.0..range.1) } MotionKind::Line(n) => { let (start,end) = match n.cmp(&0) { - Ordering::Less => self.select_lines_up(n.abs() as usize), + Ordering::Less => self.select_lines_up(n.unsigned_abs()), Ordering::Equal => self.this_line(), Ordering::Greater => self.select_lines_down(n as usize) }; @@ -903,7 +950,7 @@ impl LineBuf { Verb::Delete => start..end.saturating_add(1), _ => unreachable!() }; - deleted = self.buffer.drain(range); + self.buffer.drain(range) } MotionKind::ToLine(n) => { let (start,end) = self.select_lines_to(n); @@ -912,11 +959,11 @@ impl LineBuf { Verb::Delete => start..end.saturating_add(1), _ => unreachable!() }; - deleted = self.buffer.drain(range); + self.buffer.drain(range) } MotionKind::Null => return Ok(()), MotionKind::ToScreenPos(n) => todo!(), - } + }; register.write_to_register(deleted.collect()); self.apply_motion(motion); } @@ -1058,6 +1105,7 @@ impl LineBuf { flog!(DEBUG, cmd); let clear_redos = !cmd.is_undo_op() || cmd.verb.as_ref().is_some_and(|v| v.1.is_edit()); let is_char_insert = cmd.verb.as_ref().is_some_and(|v| v.1.is_char_insert()); + let is_line_motion = cmd.is_line_motion(); let is_undo_op = cmd.is_undo_op(); // Merge character inserts into one edit @@ -1097,6 +1145,10 @@ impl LineBuf { self.handle_edit(before, after, cursor_pos); } + if !is_line_motion { + self.saved_col = None; + } + if is_char_insert { self.merge_edit = true; } diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 993e1b0..cf1ac1f 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -89,12 +89,14 @@ impl FernVi { self.term.unwrite()?; } let offset = self.calculate_prompt_offset(); + self.line.set_first_line_offset(offset); let mut line_buf = self.prompt.clone(); line_buf.push_str(self.line.as_str()); self.term.recorded_write(&line_buf, offset)?; - self.term.position_cursor(self.line.cursor_display_coords(offset,width))?; + self.term.position_cursor(self.line.cursor_display_coords(width))?; + self.term.write(&self.mode.cursor_style()); Ok(()) } pub fn calculate_prompt_offset(&self) -> usize { diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs index 9021275..c35b123 100644 --- a/src/prompt/readline/mode.rs +++ b/src/prompt/readline/mode.rs @@ -530,6 +530,14 @@ impl ViMode for ViNormal { flog!(DEBUG, key); match key { E(K::Char(ch), M::NONE) => self.try_parse(ch), + E(K::Backspace, M::NONE) => { + Some(ViCmd { + register: Default::default(), + verb: None, + motion: Some(MotionCmd(1, Motion::BackwardChar)), + raw_seq: "".into(), + }) + } E(K::Char('R'), M::CTRL) => { let mut chars = self.pending_seq.chars().peekable(); let count = self.parse_count(&mut chars).unwrap_or(1); diff --git a/src/prompt/readline/vicmd.rs b/src/prompt/readline/vicmd.rs index 8325235..301cd17 100644 --- a/src/prompt/readline/vicmd.rs +++ b/src/prompt/readline/vicmd.rs @@ -100,6 +100,9 @@ impl ViCmd { pub fn is_undo_op(&self) -> bool { self.verb.as_ref().is_some_and(|v| matches!(v.1, Verb::Undo | Verb::Redo)) } + pub fn is_line_motion(&self) -> bool { + self.motion.as_ref().is_some_and(|m| matches!(m.1, Motion::LineUp | Motion::LineDown)) + } pub fn is_mode_transition(&self) -> bool { self.verb.as_ref().is_some_and(|v| { matches!(v.1, From 1c3357847836f04d28dabe1cc7a1773ca9164adb Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Wed, 28 May 2025 01:01:49 -0400 Subject: [PATCH 16/19] implemented more vi commands implemented replace mode re-implemented undo and redo --- src/prompt/mod.rs | 8 +- src/prompt/readline/linebuf.rs | 309 +++++++++++++++++++++------------ src/prompt/readline/mod.rs | 12 +- src/prompt/readline/mode.rs | 190 +++++++++++++++++++- src/prompt/readline/term.rs | 10 +- src/prompt/readline/vicmd.rs | 14 +- 6 files changed, 407 insertions(+), 136 deletions(-) diff --git a/src/prompt/mod.rs b/src/prompt/mod.rs index e727de6..02535f9 100644 --- a/src/prompt/mod.rs +++ b/src/prompt/mod.rs @@ -10,23 +10,23 @@ use crate::{expand::expand_prompt, libsh::error::ShResult, prelude::*, shopt::Fe /// Initialize the line editor fn get_prompt() -> ShResult { let Ok(prompt) = env::var("PS1") else { + // prompt expands to: + // // username@hostname // short/path/to/pwd/ // $ - let default = "\\e[1;0m\\u\\e[1;36m@\\e[1;31m\\h\\n\\e[1;36m\\W\\e[1;32m/\\n\\e[1;32m\\$\\e[0m "; - return Ok(format!("\n{}",expand_prompt(default)?)) + let default = "\\n\\e[1;0m\\u\\e[1;36m@\\e[1;31m\\h\\n\\e[1;36m\\W\\e[1;32m/\\n\\e[1;32m\\$\\e[0m "; + return Ok(format!("{}",expand_prompt(default)?)) }; Ok(format!("\n{}",expand_prompt(&prompt)?)) } pub fn read_line(edit_mode: FernEditMode) -> ShResult { - dbg!("hi"); let prompt = get_prompt()?; let mut reader: Box = match edit_mode { FernEditMode::Vi => Box::new(FernVi::new(Some(prompt))), FernEditMode::Emacs => todo!() }; - dbg!("there"); reader.readline() } diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index 2746fb9..4509764 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -91,6 +91,7 @@ pub struct Edit { pub cursor_pos: usize, pub old: String, pub new: String, + pub merging: bool, } impl Edit { @@ -111,6 +112,7 @@ impl Edit { cursor_pos: old_cursor_pos, old: String::new(), new: String::new(), + merging: false, }; } @@ -132,8 +134,15 @@ impl Edit { cursor_pos: old_cursor_pos, old, new, + merging: false } } + pub fn start_merge(&mut self) { + self.merging = true + } + pub fn stop_merge(&mut self) { + self.merging = false + } } #[derive(Default,Debug)] @@ -143,7 +152,7 @@ pub struct LineBuf { clamp_cursor: bool, first_line_offset: usize, saved_col: Option, - merge_edit: bool, + move_cursor_on_undo: bool, undo_stack: Vec, redo_stack: Vec, } @@ -176,11 +185,13 @@ impl LineBuf { pub fn is_empty(&self) -> bool { self.buffer.is_empty() } + pub fn set_move_cursor_on_undo(&mut self, yn: bool) { + self.move_cursor_on_undo = yn; + } pub fn clamp_cursor(&mut self) { // Normal mode does not allow you to sit on the edge of the buffer, you must be hovering over a character // Insert mode does let you set on the edge though, so that you can append new characters // This method is used in Normal mode - dbg!("clamping"); if self.cursor == self.byte_len() || self.grapheme_at_cursor() == Some("\n") { self.cursor_back(1); } @@ -417,11 +428,8 @@ impl LineBuf { if self.start_of_line() == 0 { return None }; - let mut col = self.saved_col.unwrap_or(self.cursor_column()); + let col = self.saved_col.unwrap_or(self.cursor_column()); let line = self.line_no(); - if line == 1 { - col = col.saturating_sub(self.first_line_offset.saturating_sub(1)) - } if self.saved_col.is_none() { self.saved_col = Some(col); } @@ -432,11 +440,8 @@ impl LineBuf { if self.end_of_line() == self.byte_len() { return None }; - let mut col = self.saved_col.unwrap_or(self.cursor_column()); + let col = self.saved_col.unwrap_or(self.cursor_column()); let line = self.line_no(); - if line == 0 { - col += self.first_line_offset.saturating_sub(1); - } if self.saved_col.is_none() { self.saved_col = Some(col); } @@ -668,9 +673,7 @@ impl LineBuf { } } false => { - let last_ws = self.rfind_from(pos, |c| CharClass::from(c) == CharClass::Whitespace)?; - let prev_word_end = self.rfind_from(last_ws, |c| CharClass::from(c) != CharClass::Whitespace)?; - match self.rfind_from(prev_word_end, |c| CharClass::from(c) == CharClass::Whitespace) { + match self.rfind_from(pos, |c| CharClass::from(c) == CharClass::Whitespace) { Some(n) => Some(n + 1), // Land on char after whitespace None => Some(0) // Start of buffer } @@ -750,24 +753,23 @@ impl LineBuf { Direction::Backward => { match to { To::Start => { - if self.on_start_of_word(word) { - pos = pos.checked_sub(1)?; - } - let cur_graph = self.grapheme_at(pos)?; - let diff_class_pos = self.rfind_from(pos, |c| is_other_class_or_ws(c, cur_graph))?; - if let CharClass::Whitespace = self.grapheme_at(diff_class_pos)?.into() { - let prev_word_end = self.rfind_from(diff_class_pos, |c| CharClass::from(c) != CharClass::Whitespace)?; - let cur_graph = self.grapheme_at(prev_word_end)?; - let Some(prev_word_start) = self.rfind_from(prev_word_end, |c| is_other_class_or_ws(c, cur_graph)) else { - return Some(0) - }; - Some(prev_word_start + 1) - } else { - let cur_graph = self.grapheme_at(diff_class_pos)?; - let Some(prev_word_start) = self.rfind_from(diff_class_pos, |c| is_other_class_or_ws(c, cur_graph)) else { - return Some(0) - }; - Some(prev_word_start + 1) + match self.on_start_of_word(word) { + true => { + pos = pos.checked_sub(1)?; + let prev_word_end = self.rfind_from(pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + let cur_graph = self.grapheme_at(prev_word_end)?; + match self.rfind_from(prev_word_end, |c| is_other_class_or_ws(c, cur_graph)) { + Some(n) => Some(n + 1), // Land on char after whitespace + None => Some(0) // Start of buffer + } + } + false => { + let cur_graph = self.grapheme_at(pos)?; + match self.rfind_from(pos, |c| is_other_class_or_ws(c, cur_graph)) { + Some(n) => Some(n + 1), // Land on char after whitespace + None => Some(0) // Start of buffer + } + } } } To::End => { @@ -879,18 +881,8 @@ impl LineBuf { } Motion::BackwardChar => MotionKind::Backward(1), Motion::ForwardChar => MotionKind::Forward(1), - Motion::LineUp => { - match self.find_prev_line_pos() { - None => MotionKind::Null, - Some(pos) => MotionKind::To(pos) - } - } - Motion::LineDown => { - match self.find_next_line_pos() { - None => MotionKind::Null, - Some(pos) => MotionKind::To(pos) - } - } + Motion::LineUp => MotionKind::Line(-1), + Motion::LineDown => MotionKind::Line(1), Motion::WholeBuffer => todo!(), Motion::BeginningOfBuffer => MotionKind::To(0), Motion::EndOfBuffer => MotionKind::To(self.byte_len()), @@ -910,62 +902,63 @@ impl LineBuf { Motion::Null => todo!(), } } + pub fn get_range_from_motion(&self, verb: &Verb, motion: &MotionKind) -> Option> { + match motion { + MotionKind::Forward(n) => { + let pos = self.next_pos(*n)?; + let range = self.cursor..pos; + assert!(range.end <= self.byte_len()); + Some(range) + } + MotionKind::To(n) => { + let range = mk_range(self.cursor, *n); + assert!(range.end <= self.byte_len()); + Some(range) + } + MotionKind::Backward(n) => { + let pos = self.prev_pos(*n)?; + let range = pos..self.cursor; + Some(range) + } + MotionKind::Range(range) => { + Some(range.0..range.1) + } + MotionKind::Line(n) => { + let (start,end) = match n.cmp(&0) { + Ordering::Less => self.select_lines_up(n.unsigned_abs()), + Ordering::Equal => self.this_line(), + Ordering::Greater => self.select_lines_down(*n as usize) + }; + let range = match verb { + Verb::Change => mk_range(start,end), + Verb::Delete => mk_range(start,(end + 1).min(self.byte_len())), + _ => unreachable!() + }; + Some(range) + } + MotionKind::ToLine(n) => { + let (start,end) = self.select_lines_to(*n); + let range = match verb { + Verb::Change => start..end, + Verb::Delete => start..end.saturating_add(1), + _ => unreachable!() + }; + Some(range) + } + MotionKind::Null => return None, + MotionKind::ToScreenPos(n) => todo!(), + } + } pub fn exec_verb(&mut self, verb: Verb, motion: MotionKind, register: RegisterName) -> ShResult<()> { match verb { Verb::Change | Verb::Delete => { - let deleted = match motion { - MotionKind::Forward(n) => { - let Some(pos) = self.next_pos(n) else { - return Ok(()) - }; - let range = self.cursor..pos; - assert!(range.end < self.byte_len()); - self.buffer.drain(range) - } - MotionKind::To(n) => { - let range = mk_range(self.cursor, n); - assert!(range.end < self.byte_len()); - self.buffer.drain(range) - } - MotionKind::Backward(n) => { - let Some(back) = self.prev_pos(n) else { - return Ok(()) - }; - let range = back..self.cursor; - dbg!(&range); - self.buffer.drain(range) - } - MotionKind::Range(range) => { - self.buffer.drain(range.0..range.1) - } - MotionKind::Line(n) => { - let (start,end) = match n.cmp(&0) { - Ordering::Less => self.select_lines_up(n.unsigned_abs()), - Ordering::Equal => self.this_line(), - Ordering::Greater => self.select_lines_down(n as usize) - }; - let range = match verb { - Verb::Change => start..end, - Verb::Delete => start..end.saturating_add(1), - _ => unreachable!() - }; - self.buffer.drain(range) - } - MotionKind::ToLine(n) => { - let (start,end) = self.select_lines_to(n); - let range = match verb { - Verb::Change => start..end, - Verb::Delete => start..end.saturating_add(1), - _ => unreachable!() - }; - self.buffer.drain(range) - } - MotionKind::Null => return Ok(()), - MotionKind::ToScreenPos(n) => todo!(), + let Some(range) = self.get_range_from_motion(&verb, &motion) else { + return Ok(()) }; + let deleted = self.buffer.drain(range.clone()); register.write_to_register(deleted.collect()); - self.apply_motion(motion); + self.cursor = range.start; } Verb::DeleteChar(anchor) => { match anchor { @@ -981,16 +974,94 @@ impl LineBuf { } } } - Verb::Yank => todo!(), - Verb::ReplaceChar(_) => todo!(), + Verb::Yank => { + let Some(range) = self.get_range_from_motion(&verb, &motion) else { + return Ok(()) + }; + let yanked = &self.buffer[range.clone()]; + register.write_to_register(yanked.to_string()); + self.cursor = range.start; + } + Verb::ReplaceChar(c) => { + let Some(range) = self.get_range_from_motion(&verb, &motion) else { + return Ok(()) + }; + let new_range = format!("{c}"); + let cursor_pos = range.end; + self.buffer.replace_range(range, &new_range); + self.cursor = cursor_pos + } Verb::Substitute => todo!(), - Verb::ToggleCase => todo!(), + Verb::ToggleCase => { + let Some(range) = self.get_range_from_motion(&verb, &motion) else { + return Ok(()) + }; + let mut new_range = String::new(); + let slice = &self.buffer[range.clone()]; + for ch in slice.chars() { + if ch.is_ascii_lowercase() { + new_range.push(ch.to_ascii_uppercase()) + } else if ch.is_ascii_uppercase() { + new_range.push(ch.to_ascii_lowercase()) + } else { + new_range.push(ch) + } + } + self.buffer.replace_range(range.clone(), &new_range); + self.cursor = range.end; + } Verb::Complete => todo!(), Verb::CompleteBackward => todo!(), - Verb::Undo => todo!(), - Verb::Redo => todo!(), + Verb::Undo => { + let Some(undo) = self.undo_stack.pop() else { + return Ok(()) + }; + flog!(DEBUG, undo); + let Edit { pos, cursor_pos, old, new, .. } = undo; + let range = pos..pos + new.len(); + self.buffer.replace_range(range, &old); + let redo_cursor_pos = self.cursor; + if self.move_cursor_on_undo { + self.cursor = cursor_pos; + } + let redo = Edit { pos, cursor_pos: redo_cursor_pos, old: new, new: old, merging: false }; + self.redo_stack.push(redo); + } + Verb::Redo => { + let Some(redo) = self.redo_stack.pop() else { + return Ok(()) + }; + flog!(DEBUG, redo); + let Edit { pos, cursor_pos, old, new, .. } = redo; + let range = pos..pos + new.len(); + self.buffer.replace_range(range, &old); + let undo_cursor_pos = self.cursor; + if self.move_cursor_on_undo { + self.cursor = cursor_pos; + } + let undo = Edit { pos, cursor_pos: undo_cursor_pos, old: new, new: old, merging: false }; + self.undo_stack.push(undo); + } Verb::RepeatLast => todo!(), - Verb::Put(anchor) => todo!(), + Verb::Put(anchor) => { + let Some(register_content) = register.read_from_register() else { + return Ok(()) + }; + match anchor { + Anchor::After => { + for ch in register_content.chars() { + self.cursor_fwd(1); // Only difference is which one you start with + self.insert(ch); + } + } + Anchor::Before => { + for ch in register_content.chars() { + self.insert(ch); + self.cursor_fwd(1); + } + } + } + } Verb::InsertModeLineBreak(anchor) => { match anchor { Anchor::After => { @@ -1015,12 +1086,19 @@ impl LineBuf { Verb::Breakline(anchor) => todo!(), Verb::Indent => todo!(), Verb::Dedent => todo!(), - Verb::Equalize => todo!(), - Verb::AcceptLine => todo!(), + Verb::Equalize => todo!(), // I fear this one Verb::Builder(verb_builder) => todo!(), - Verb::EndOfFile => todo!(), + Verb::EndOfFile => { + if !self.buffer.is_empty() { + self.cursor = 0; + self.buffer.clear(); + } else { + sh_quit(0) + } + } - Verb::OverwriteMode | + Verb::AcceptLine | + Verb::ReplaceMode | Verb::InsertMode | Verb::NormalMode | Verb::VisualMode => { @@ -1031,7 +1109,6 @@ impl LineBuf { Ok(()) } pub fn apply_motion(&mut self, motion: MotionKind) { - dbg!(&motion); match motion { MotionKind::Forward(n) => { for _ in 0..n { @@ -1048,8 +1125,11 @@ impl LineBuf { } } MotionKind::To(n) => { - assert!((0..=self.byte_len()).contains(&n)); - self.cursor = n + if n > self.byte_len() { + self.cursor = self.byte_len(); + } else { + self.cursor = n + } } MotionKind::Range(range) => { assert!((0..self.byte_len()).contains(&range.0)); @@ -1085,8 +1165,11 @@ impl LineBuf { MotionKind::ToScreenPos(_) => todo!(), } } + pub fn edit_is_merging(&self) -> bool { + self.undo_stack.last().is_some_and(|edit| edit.merging) + } pub fn handle_edit(&mut self, old: String, new: String, curs_pos: usize) { - if self.merge_edit { + if self.edit_is_merging() { let diff = Edit::diff(&old, &new, curs_pos); let Some(mut edit) = self.undo_stack.pop() else { self.undo_stack.push(diff); @@ -1094,6 +1177,7 @@ impl LineBuf { }; edit.new.push_str(&diff.new); + edit.old.push_str(&diff.old); self.undo_stack.push(edit); } else { @@ -1102,15 +1186,16 @@ impl LineBuf { } } pub fn exec_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { - flog!(DEBUG, cmd); let clear_redos = !cmd.is_undo_op() || cmd.verb.as_ref().is_some_and(|v| v.1.is_edit()); let is_char_insert = cmd.verb.as_ref().is_some_and(|v| v.1.is_char_insert()); let is_line_motion = cmd.is_line_motion(); let is_undo_op = cmd.is_undo_op(); // Merge character inserts into one edit - if self.merge_edit && cmd.verb.as_ref().is_none_or(|v| !v.1.is_char_insert()) { - self.merge_edit = false; + if self.edit_is_merging() && cmd.verb.as_ref().is_none_or(|v| !v.1.is_char_insert()) { + if let Some(edit) = self.undo_stack.last_mut() { + edit.stop_merge(); + } } let ViCmd { register, verb, motion, .. } = cmd; @@ -1150,7 +1235,9 @@ impl LineBuf { } if is_char_insert { - self.merge_edit = true; + if let Some(edit) = self.undo_stack.last_mut() { + edit.start_merge(); + } } if self.clamp_cursor { diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index cf1ac1f..3aba052 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -1,7 +1,7 @@ use std::time::Duration; use linebuf::{strip_ansi_codes_and_escapes, LineBuf}; -use mode::{CmdReplay, ViInsert, ViMode, ViNormal}; +use mode::{CmdReplay, ViInsert, ViMode, ViNormal, ViReplace}; use term::Terminal; use unicode_width::UnicodeWidthStr; use vicmd::{Motion, MotionCmd, RegisterName, Verb, VerbCmd, ViCmd}; @@ -60,6 +60,7 @@ impl Readline for FernVi { }; if cmd.should_submit() { + self.term.write("\n"); return Ok(self.line.to_string()); } @@ -110,20 +111,23 @@ impl FernVi { let count = cmd.verb_count(); let mut mode: Box = match cmd.verb().unwrap().1 { Verb::InsertModeLineBreak(_) | + Verb::Change | Verb::InsertMode => { - self.line.set_cursor_clamp(false); Box::new(ViInsert::new().with_count(count as u16)) } Verb::NormalMode => { - self.line.set_cursor_clamp(true); Box::new(ViNormal::new()) } + Verb::ReplaceMode => { + Box::new(ViReplace::new().with_count(count as u16)) + } Verb::VisualMode => todo!(), - Verb::OverwriteMode => todo!(), _ => unreachable!() }; std::mem::swap(&mut mode, &mut self.mode); + self.line.set_cursor_clamp(self.mode.clamp_cursor()); + self.line.set_move_cursor_on_undo(self.mode.move_cursor_on_undo()); self.term.write(&mode.cursor_style()); if mode.is_repeatable() { diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs index c35b123..6aefaef 100644 --- a/src/prompt/readline/mode.rs +++ b/src/prompt/readline/mode.rs @@ -38,6 +38,8 @@ pub trait ViMode { fn as_replay(&self) -> Option; fn cursor_style(&self) -> String; fn pending_seq(&self) -> Option; + fn move_cursor_on_undo(&self) -> bool; + fn clamp_cursor(&self) -> bool; } #[derive(Default,Debug)] @@ -58,7 +60,16 @@ impl ViInsert { pub fn register_and_return(&mut self) -> Option { let cmd = self.take_cmd(); self.register_cmd(&cmd); - return Some(cmd) + Some(cmd) + } + pub fn ctrl_w_is_undo(&self) -> bool { + let insert_count = self.cmds.iter().filter(|cmd| { + matches!(cmd.verb(),Some(VerbCmd(1, Verb::InsertChar(_)))) + }).count(); + let backspace_count = self.cmds.iter().filter(|cmd| { + matches!(cmd.verb(),Some(VerbCmd(1, Verb::Delete))) + }).count(); + insert_count > backspace_count } pub fn register_cmd(&mut self, cmd: &ViCmd) { self.cmds.push(cmd.clone()) @@ -76,6 +87,17 @@ impl ViMode for ViInsert { self.pending_cmd.set_motion(MotionCmd(1,Motion::ForwardChar)); self.register_and_return() } + E(K::Char('W'), M::CTRL) => { + if self.ctrl_w_is_undo() { + self.pending_cmd.set_verb(VerbCmd(1,Verb::Undo)); + self.cmds.clear(); + Some(self.take_cmd()) + } else { + self.pending_cmd.set_verb(VerbCmd(1, Verb::Delete)); + self.pending_cmd.set_motion(MotionCmd(1, Motion::BackwardWord(To::Start, Word::Normal))); + self.register_and_return() + } + } E(K::Char('H'), M::CTRL) | E(K::Backspace, M::NONE) => { self.pending_cmd.set_verb(VerbCmd(1,Verb::Delete)); @@ -117,8 +139,113 @@ impl ViMode for ViInsert { fn pending_seq(&self) -> Option { None } + fn move_cursor_on_undo(&self) -> bool { + true + } + fn clamp_cursor(&self) -> bool { + false + } } +#[derive(Default,Debug)] +pub struct ViReplace { + cmds: Vec, + pending_cmd: ViCmd, + repeat_count: u16 +} + +impl ViReplace { + pub fn new() -> Self { + Self::default() + } + pub fn with_count(mut self, repeat_count: u16) -> Self { + self.repeat_count = repeat_count; + self + } + pub fn register_and_return(&mut self) -> Option { + let cmd = self.take_cmd(); + self.register_cmd(&cmd); + Some(cmd) + } + pub fn ctrl_w_is_undo(&self) -> bool { + let insert_count = self.cmds.iter().filter(|cmd| { + matches!(cmd.verb(),Some(VerbCmd(1, Verb::ReplaceChar(_)))) + }).count(); + let backspace_count = self.cmds.iter().filter(|cmd| { + matches!(cmd.verb(),Some(VerbCmd(1, Verb::Delete))) + }).count(); + insert_count > backspace_count + } + pub fn register_cmd(&mut self, cmd: &ViCmd) { + self.cmds.push(cmd.clone()) + } + pub fn take_cmd(&mut self) -> ViCmd { + std::mem::take(&mut self.pending_cmd) + } +} + +impl ViMode for ViReplace { + fn handle_key(&mut self, key: E) -> Option { + match key { + E(K::Char(ch), M::NONE) => { + self.pending_cmd.set_verb(VerbCmd(1,Verb::ReplaceChar(ch))); + self.pending_cmd.set_motion(MotionCmd(1,Motion::ForwardChar)); + self.register_and_return() + } + E(K::Char('W'), M::CTRL) => { + if self.ctrl_w_is_undo() { + self.pending_cmd.set_verb(VerbCmd(1,Verb::Undo)); + self.cmds.clear(); + Some(self.take_cmd()) + } else { + self.pending_cmd.set_motion(MotionCmd(1, Motion::BackwardWord(To::Start, Word::Normal))); + self.register_and_return() + } + } + E(K::Char('H'), M::CTRL) | + E(K::Backspace, M::NONE) => { + self.pending_cmd.set_motion(MotionCmd(1,Motion::BackwardChar)); + self.register_and_return() + } + + E(K::BackTab, M::NONE) => { + self.pending_cmd.set_verb(VerbCmd(1,Verb::CompleteBackward)); + self.register_and_return() + } + + E(K::Char('I'), M::CTRL) | + E(K::Tab, M::NONE) => { + self.pending_cmd.set_verb(VerbCmd(1,Verb::Complete)); + self.register_and_return() + } + + E(K::Esc, M::NONE) => { + self.pending_cmd.set_verb(VerbCmd(1,Verb::NormalMode)); + self.pending_cmd.set_motion(MotionCmd(1,Motion::BackwardChar)); + self.register_and_return() + } + _ => common_cmds(key) + } + } + fn is_repeatable(&self) -> bool { + true + } + fn cursor_style(&self) -> String { + "\x1b[4 q".to_string() + } + fn pending_seq(&self) -> Option { + None + } + fn as_replay(&self) -> Option { + Some(CmdReplay::mode(self.cmds.clone(), self.repeat_count)) + } + fn move_cursor_on_undo(&self) -> bool { + true + } + fn clamp_cursor(&self) -> bool { + true + } +} #[derive(Default,Debug)] pub struct ViNormal { pending_seq: String, @@ -235,9 +362,7 @@ impl ViNormal { break 'verb_parse Some(VerbCmd(count, Verb::Put(Anchor::Before))); } 'r' => { - let Some(ch) = chars_clone.next() else { - return None - }; + let ch = chars_clone.next()?; return Some( ViCmd { register, @@ -247,6 +372,26 @@ impl ViNormal { } ) } + 'R' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::ReplaceMode)), + motion: None, + raw_seq: self.take_cmd() + } + ) + } + '~' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(1, Verb::ToggleCase)), + motion: Some(MotionCmd(count, Motion::ForwardChar)), + raw_seq: self.take_cmd() + } + ) + } 'u' => { return Some( ViCmd { @@ -329,6 +474,36 @@ impl ViNormal { chars = chars_clone; break 'verb_parse Some(VerbCmd(count, Verb::Change)) } + 'Y' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::Yank)), + motion: Some(MotionCmd(1, Motion::EndOfLine)), + raw_seq: self.take_cmd() + } + ) + } + 'D' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::Delete)), + motion: Some(MotionCmd(1, Motion::EndOfLine)), + raw_seq: self.take_cmd() + } + ) + } + 'C' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::Change)), + motion: Some(MotionCmd(1, Motion::EndOfLine)), + raw_seq: self.take_cmd() + } + ) + } '=' => { chars = chars_clone; break 'verb_parse Some(VerbCmd(count, Verb::Equalize)) @@ -580,6 +755,13 @@ impl ViMode for ViNormal { fn pending_seq(&self) -> Option { Some(self.pending_seq.clone()) } + + fn move_cursor_on_undo(&self) -> bool { + false + } + fn clamp_cursor(&self) -> bool { + true + } } pub fn common_cmds(key: E) -> Option { diff --git a/src/prompt/readline/term.rs b/src/prompt/readline/term.rs index bc1a2b2..716222f 100644 --- a/src/prompt/readline/term.rs +++ b/src/prompt/readline/term.rs @@ -181,6 +181,7 @@ impl Terminal { Ok(()) } + /// Rewinds terminal writing, clears lines and lands on the anchor point of the prompt pub fn unwrite(&mut self) -> ShResult<()> { self.unposition_cursor()?; let WriteMap { lines, cols, offset } = self.write_records; @@ -194,7 +195,6 @@ impl Terminal { } pub fn position_cursor(&mut self, (lines,col): (usize,usize)) -> ShResult<()> { - dbg!(self.cursor_pos()); self.cursor_records.lines = lines; self.cursor_records.cols = col; self.cursor_records.offset = self.cursor_pos().1; @@ -205,14 +205,11 @@ impl Terminal { self.write(&format!("\x1b[{col}G")); - dbg!("done moving"); - dbg!(self.cursor_pos()); - Ok(()) } + /// Rewinds cursor positioning, lands on the end of the buffer pub fn unposition_cursor(&mut self) ->ShResult<()> { - dbg!(self.cursor_pos()); let WriteMap { lines, cols, offset } = self.cursor_records; for _ in 0..lines { @@ -221,9 +218,6 @@ impl Terminal { self.write(&format!("\x1b[{offset}G")); - dbg!("done moving back"); - dbg!(self.cursor_pos()); - Ok(()) } diff --git a/src/prompt/readline/vicmd.rs b/src/prompt/readline/vicmd.rs index 301cd17..20f11da 100644 --- a/src/prompt/readline/vicmd.rs +++ b/src/prompt/readline/vicmd.rs @@ -106,11 +106,12 @@ impl ViCmd { pub fn is_mode_transition(&self) -> bool { self.verb.as_ref().is_some_and(|v| { matches!(v.1, + Verb::Change | Verb::InsertMode | Verb::InsertModeLineBreak(_) | Verb::NormalMode | Verb::VisualMode | - Verb::OverwriteMode + Verb::ReplaceMode ) }) } @@ -150,7 +151,7 @@ pub enum Verb { Redo, RepeatLast, Put(Anchor), - OverwriteMode, + ReplaceMode, InsertMode, InsertModeLineBreak(Anchor), NormalMode, @@ -190,7 +191,7 @@ impl Verb { Self::Substitute | Self::ToggleCase | Self::Put(_) | - Self::OverwriteMode | + Self::ReplaceMode | Self::InsertModeLineBreak(_) | Self::JoinLines | Self::InsertChar(_) | @@ -211,7 +212,7 @@ impl Verb { Self::ToggleCase | Self::RepeatLast | Self::Put(_) | - Self::OverwriteMode | + Self::ReplaceMode | Self::InsertModeLineBreak(_) | Self::JoinLines | Self::InsertChar(_) | @@ -221,7 +222,10 @@ impl Verb { ) } pub fn is_char_insert(&self) -> bool { - matches!(self, Self::InsertChar(_)) + matches!(self, + Self::InsertChar(_) | + Self::ReplaceChar(_) + ) } } From d15903fea1f32cd853425cc51dc1c5406b521d1a Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Wed, 28 May 2025 02:45:16 -0400 Subject: [PATCH 17/19] early support for visual line motions like gk and gj --- src/prompt/readline/linebuf.rs | 97 ++++++++++++++++++++++++++++------ src/prompt/readline/mod.rs | 3 +- src/prompt/readline/mode.rs | 8 +++ src/prompt/readline/vicmd.rs | 4 ++ 4 files changed, 96 insertions(+), 16 deletions(-) diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index 4509764..a371c93 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -1,9 +1,9 @@ -use std::{cmp::Ordering, fmt::Display, ops::{Deref, DerefMut, Range, RangeBounds, RangeInclusive}, str::FromStr, sync::Arc}; +use std::{cmp::Ordering, fmt::Display, ops::{Range, RangeBounds}}; use unicode_segmentation::UnicodeSegmentation; use unicode_width::UnicodeWidthStr; -use crate::libsh::{error::ShResult, sys::sh_quit, term::{Style, Styled}}; +use crate::libsh::{error::ShResult, sys::sh_quit}; use crate::prelude::*; use super::vicmd::{Anchor, Bound, Dest, Direction, Motion, RegisterName, TextObj, To, Verb, ViCmd, Word}; @@ -28,7 +28,7 @@ pub enum MotionKind { /// Absolute position based on display width of characters /// Factors in the length of the prompt, and skips newlines - ToScreenPos(usize), + ScreenLine(isize) } impl MotionKind { @@ -80,11 +80,6 @@ fn is_other_class_or_ws(a: &str, b: &str) -> bool { } } -pub struct UndoPayload { - buffer: String, - cursor: usize -} - #[derive(Default,Debug)] pub struct Edit { pub pos: usize, @@ -152,6 +147,7 @@ pub struct LineBuf { clamp_cursor: bool, first_line_offset: usize, saved_col: Option, + term_dims: (usize,usize), // Height, width move_cursor_on_undo: bool, undo_stack: Vec, redo_stack: Vec, @@ -171,6 +167,9 @@ impl LineBuf { pub fn as_str(&self) -> &str { &self.buffer } + pub fn update_term_dims(&mut self, dims: (usize,usize)) { + self.term_dims = dims + } pub fn take(&mut self) -> String { let line = std::mem::take(&mut self.buffer); *self = Self::default(); @@ -237,7 +236,7 @@ impl LineBuf { pub fn grapheme_at_cursor_offset(&self, offset: isize) -> Option<&str> { match offset.cmp(&0) { Ordering::Equal => { - return self.grapheme_at(self.cursor); + self.grapheme_at(self.cursor) } Ordering::Less => { // Walk backward from the start of the line or buffer up to the cursor @@ -364,7 +363,7 @@ impl LineBuf { lines } pub fn display_coords(&self, term_width: usize) -> (usize,usize) { - let mut chars = self.slice_to_cursor().chars(); + let chars = self.slice_to_cursor().chars(); let mut lines = 0; let mut col = 0; @@ -883,6 +882,8 @@ impl LineBuf { Motion::ForwardChar => MotionKind::Forward(1), Motion::LineUp => MotionKind::Line(-1), Motion::LineDown => MotionKind::Line(1), + Motion::ScreenLineUp => MotionKind::ScreenLine(-1), + Motion::ScreenLineDown => MotionKind::ScreenLine(1), Motion::WholeBuffer => todo!(), Motion::BeginningOfBuffer => MotionKind::To(0), Motion::EndOfBuffer => MotionKind::To(self.byte_len()), @@ -902,6 +903,64 @@ impl LineBuf { Motion::Null => todo!(), } } + pub fn calculate_display_offset(&self, n_lines: isize) -> Option { + let (start,end) = self.this_line(); + let graphemes: Vec<(usize, usize, &str)> = self.buffer[start..end] + .graphemes(true) + .scan(start, |idx, g| { + let current = *idx; + *idx += g.len(); // Advance by number of bytes + Some((g.width(), current, g)) + }).collect(); + + let mut cursor_line_index = 0; + let mut cursor_visual_col = 0; + let mut screen_lines = vec![]; + let mut cur_line = vec![]; + let mut line_width = 0; + + for (width, byte_idx, grapheme) in graphemes { + if byte_idx == self.cursor { + // Save this to later find column + cursor_line_index = screen_lines.len(); + cursor_visual_col = line_width; + } + + let new_line_width = line_width + width; + if new_line_width > self.term_dims.1 { + screen_lines.push(std::mem::take(&mut cur_line)); + cur_line.push((width, byte_idx, grapheme)); + line_width = width; + } else { + cur_line.push((width, byte_idx, grapheme)); + line_width = new_line_width; + } + } + + if !cur_line.is_empty() { + screen_lines.push(cur_line); + } + + if screen_lines.len() == 1 { + return None + } + + let target_line_index = (cursor_line_index as isize + n_lines) + .clamp(0, (screen_lines.len() - 1) as isize) as usize; + + let mut col = 0; + for (width, byte_idx, _) in &screen_lines[target_line_index] { + if col + width > cursor_visual_col { + return Some(*byte_idx); + } + col += width; + } + + // If you went past the end of the line + screen_lines[target_line_index] + .last() + .map(|(_, byte_idx, _)| *byte_idx) + } pub fn get_range_from_motion(&self, verb: &Verb, motion: &MotionKind) -> Option> { match motion { MotionKind::Forward(n) => { @@ -945,8 +1004,11 @@ impl LineBuf { }; Some(range) } - MotionKind::Null => return None, - MotionKind::ToScreenPos(n) => todo!(), + MotionKind::Null => None, + MotionKind::ScreenLine(n) => { + let pos = self.calculate_display_offset(*n)?; + Some(mk_range(pos, self.cursor)) + } } } pub fn exec_verb(&mut self, verb: Verb, motion: MotionKind, register: RegisterName) -> ShResult<()> { @@ -1144,11 +1206,11 @@ impl LineBuf { self.cursor = start; } Ordering::Less => { - let (start,_) = self.select_lines_up(n.abs() as usize); + let (start,_) = self.select_lines_up(n.unsigned_abs()); self.cursor = start; } Ordering::Greater => { - let (_,end) = self.select_lines_down(n.abs() as usize); + let (_,end) = self.select_lines_down(n.unsigned_abs()); self.cursor = end.saturating_sub(1); let (start,_) = self.this_line(); self.cursor = start; @@ -1162,7 +1224,12 @@ impl LineBuf { self.cursor = start; } MotionKind::Null => { /* Pass */ } - MotionKind::ToScreenPos(_) => todo!(), + MotionKind::ScreenLine(n) => { + let Some(pos) = self.calculate_display_offset(n) else { + return + }; + self.cursor = pos; + } } } pub fn edit_is_merging(&self) -> bool { diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 3aba052..7c6b278 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -85,12 +85,13 @@ impl FernVi { } } pub fn print_buf(&mut self, refresh: bool) -> ShResult<()> { - let (_,width) = self.term.get_dimensions()?; + let (height,width) = self.term.get_dimensions()?; if refresh { self.term.unwrite()?; } let offset = self.calculate_prompt_offset(); self.line.set_first_line_offset(offset); + self.line.update_term_dims((height,width)); let mut line_buf = self.prompt.clone(); line_buf.push_str(self.line.as_str()); diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs index 6aefaef..0f9bd2e 100644 --- a/src/prompt/readline/mode.rs +++ b/src/prompt/readline/mode.rs @@ -545,6 +545,14 @@ impl ViNormal { chars = chars_clone; break 'motion_parse Some(MotionCmd(count, Motion::BackwardWord(To::End, Word::Big))); } + 'k' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::ScreenLineUp)); + } + 'j' => { + chars = chars_clone; + break 'motion_parse Some(MotionCmd(count, Motion::ScreenLineDown)); + } _ => return self.quit_parse() } } else { diff --git a/src/prompt/readline/vicmd.rs b/src/prompt/readline/vicmd.rs index 20f11da..741100e 100644 --- a/src/prompt/readline/vicmd.rs +++ b/src/prompt/readline/vicmd.rs @@ -251,8 +251,12 @@ pub enum Motion { ForwardChar, /// move to the same column on the previous line LineUp, + /// move to the same column on the previous visual line + ScreenLineUp, /// move to the same column on the next line LineDown, + /// move to the same column on the next visual line + ScreenLineDown, /// Whole user input (not really a movement but a range) WholeBuffer, /// beginning-of-register From f67543c1114166c460c1197a80996f6a2e0ec016 Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Wed, 28 May 2025 03:21:51 -0400 Subject: [PATCH 18/19] early implementation of inserting verbatim with ctrl+v --- src/prompt/readline/linebuf.rs | 20 +++++++++- src/prompt/readline/mod.rs | 67 ++++++++++++++++++++++++++++++++++ src/prompt/readline/mode.rs | 7 ---- 3 files changed, 86 insertions(+), 8 deletions(-) diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index a371c93..e3cda72 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -1144,7 +1144,12 @@ impl LineBuf { self.insert(ch); self.apply_motion(motion); } - Verb::Insert(_) => todo!(), + Verb::Insert(str) => { + for ch in str.chars() { + self.insert(ch); + self.cursor_fwd(1); + } + } Verb::Breakline(anchor) => todo!(), Verb::Indent => todo!(), Verb::Dedent => todo!(), @@ -1203,14 +1208,23 @@ impl LineBuf { match n.cmp(&0) { Ordering::Equal => { let (start,_) = self.this_line(); + if start == 0 { + return + } self.cursor = start; } Ordering::Less => { let (start,_) = self.select_lines_up(n.unsigned_abs()); + if start == 0 { + return + } self.cursor = start; } Ordering::Greater => { let (_,end) = self.select_lines_down(n.unsigned_abs()); + if end == self.byte_len() { + return + } self.cursor = end.saturating_sub(1); let (start,_) = self.this_line(); self.cursor = start; @@ -1264,6 +1278,10 @@ impl LineBuf { edit.stop_merge(); } } + if clear_redos { + flog!(DEBUG, "clearing redos"); + flog!(DEBUG,cmd); + } let ViCmd { register, verb, motion, .. } = cmd; diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 7c6b278..afd53ee 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -1,5 +1,6 @@ use std::time::Duration; +use keys::{KeyCode, KeyEvent, ModKeys}; use linebuf::{strip_ansi_codes_and_escapes, LineBuf}; use mode::{CmdReplay, ViInsert, ViMode, ViNormal, ViReplace}; use term::Terminal; @@ -55,6 +56,10 @@ impl Readline for FernVi { loop { let key = self.term.read_key(); + if let KeyEvent(KeyCode::Char('V'), ModKeys::CTRL) = key { + self.handle_verbatim(); + continue + } let Some(cmd) = self.mode.handle_key(key) else { continue }; @@ -84,6 +89,68 @@ impl FernVi { last_movement: None, } } + pub fn handle_verbatim(&mut self) -> ShResult<()> { + let mut buf = [0u8; 8]; + let mut collected = Vec::new(); + + loop { + let n = self.term.read_byte(&mut buf[..1]); + if n == 0 { + continue; + } + collected.push(buf[0]); + + // If it starts with ESC, treat as escape sequence + if collected[0] == 0x1b { + loop { + let n = self.term.peek_byte(&mut buf[..1]); + if n == 0 { + break + } + collected.push(buf[0]); + // Ends a CSI sequence + if (0x40..=0x7e).contains(&buf[0]) { + break; + } + } + let Ok(seq) = std::str::from_utf8(&collected) else { + return Ok(()) + }; + let cmd = ViCmd { + register: Default::default(), + verb: Some(VerbCmd(1, Verb::Insert(seq.to_string()))), + motion: None, + raw_seq: seq.to_string(), + }; + self.line.exec_cmd(cmd)?; + } + + // Optional: handle other edge cases, e.g., raw control codes + if collected[0] < 0x20 || collected[0] == 0x7F { + let ctrl_seq = std::str::from_utf8(&collected).unwrap(); + let cmd = ViCmd { + register: Default::default(), + verb: Some(VerbCmd(1, Verb::Insert(ctrl_seq.to_string()))), + motion: None, + raw_seq: ctrl_seq.to_string(), + }; + self.line.exec_cmd(cmd)?; + break; + } + + // Try to parse as UTF-8 if it's a valid Unicode sequence + if let Ok(s) = std::str::from_utf8(&collected) { + if s.chars().count() == 1 { + let ch = s.chars().next().unwrap(); + // You got a literal Unicode char + eprintln!("Got char: {:?}", ch); + break; + } + } + + } + Ok(()) + } pub fn print_buf(&mut self, refresh: bool) -> ShResult<()> { let (height,width) = self.term.get_dimensions()?; if refresh { diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs index 0f9bd2e..f7f9ff7 100644 --- a/src/prompt/readline/mode.rs +++ b/src/prompt/readline/mode.rs @@ -302,7 +302,6 @@ impl ViNormal { } pub fn try_parse(&mut self, ch: char) -> Option { self.pending_seq.push(ch); - flog!(DEBUG, self.pending_seq); let mut chars = self.pending_seq.chars().peekable(); let register = 'reg_parse: { @@ -333,7 +332,6 @@ impl ViNormal { let Some(ch) = chars_clone.next() else { break 'verb_parse None }; - flog!(DEBUG, "parsing verb char '{}'",ch); match ch { '.' => { return Some( @@ -519,7 +517,6 @@ impl ViNormal { let Some(ch) = chars_clone.next() else { break 'motion_parse None }; - flog!(DEBUG, "parsing motion char '{}'",ch); match (ch, &verb) { ('d', Some(VerbCmd(_,Verb::Delete))) | ('c', Some(VerbCmd(_,Verb::Change))) | @@ -692,15 +689,12 @@ impl ViNormal { raw_seq: std::mem::take(&mut self.pending_seq) } ); - flog!(DEBUG, cmd); cmd } CmdState::Pending => { - flog!(DEBUG, "pending sequence: {}", self.pending_seq); None } CmdState::Invalid => { - flog!(DEBUG, "invalid sequence: {}",self.pending_seq); self.pending_seq.clear(); None } @@ -710,7 +704,6 @@ impl ViNormal { impl ViMode for ViNormal { fn handle_key(&mut self, key: E) -> Option { - flog!(DEBUG, key); match key { E(K::Char(ch), M::NONE) => self.try_parse(ch), E(K::Backspace, M::NONE) => { From 8cacbfdbdd0bcea684bb469040236841ed27ad5a Mon Sep 17 00:00:00 2001 From: Kyler Clay Date: Wed, 28 May 2025 20:24:09 -0400 Subject: [PATCH 19/19] implemented history for the line editor --- src/libsh/error.rs | 34 +-- src/prompt/mod.rs | 8 +- src/prompt/readline/history.rs | 258 ++++++++++++++++++++ src/prompt/readline/linebuf.rs | 432 ++++++++++++++++++++++++--------- src/prompt/readline/mod.rs | 110 ++++++++- src/prompt/readline/mode.rs | 31 +++ src/prompt/readline/term.rs | 4 +- src/prompt/readline/vicmd.rs | 1 + 8 files changed, 731 insertions(+), 147 deletions(-) create mode 100644 src/prompt/readline/history.rs diff --git a/src/libsh/error.rs b/src/libsh/error.rs index 4d73854..d508fdd 100644 --- a/src/libsh/error.rs +++ b/src/libsh/error.rs @@ -316,6 +316,7 @@ pub enum ShErrKind { ParseErr, InternalErr, ExecFail, + HistoryReadErr, ResourceLimitExceeded, BadPermission, Errno, @@ -332,22 +333,23 @@ pub enum ShErrKind { impl Display for ShErrKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let output = match self { - ShErrKind::IoErr => "I/O Error", - ShErrKind::SyntaxErr => "Syntax Error", - ShErrKind::ParseErr => "Parse Error", - ShErrKind::InternalErr => "Internal Error", - ShErrKind::ExecFail => "Execution Failed", - ShErrKind::ResourceLimitExceeded => "Resource Limit Exceeded", - ShErrKind::BadPermission => "Bad Permissions", - ShErrKind::Errno => "ERRNO", - ShErrKind::FileNotFound(file) => &format!("File not found: {file}"), - ShErrKind::CmdNotFound(cmd) => &format!("Command not found: {cmd}"), - ShErrKind::CleanExit(_) => "", - ShErrKind::FuncReturn(_) => "", - ShErrKind::LoopContinue(_) => "", - ShErrKind::LoopBreak(_) => "", - ShErrKind::ReadlineErr => "Line Read Error", - ShErrKind::Null => "", + Self::IoErr => "I/O Error", + Self::SyntaxErr => "Syntax Error", + Self::ParseErr => "Parse Error", + Self::InternalErr => "Internal Error", + Self::HistoryReadErr => "History Parse Error", + Self::ExecFail => "Execution Failed", + Self::ResourceLimitExceeded => "Resource Limit Exceeded", + Self::BadPermission => "Bad Permissions", + Self::Errno => "ERRNO", + Self::FileNotFound(file) => &format!("File not found: {file}"), + Self::CmdNotFound(cmd) => &format!("Command not found: {cmd}"), + Self::CleanExit(_) => "", + Self::FuncReturn(_) => "", + Self::LoopContinue(_) => "", + Self::LoopBreak(_) => "", + Self::ReadlineErr => "Line Read Error", + Self::Null => "", }; write!(f,"{output}") } diff --git a/src/prompt/mod.rs b/src/prompt/mod.rs index 02535f9..ba70ca7 100644 --- a/src/prompt/mod.rs +++ b/src/prompt/mod.rs @@ -14,18 +14,18 @@ fn get_prompt() -> ShResult { // // username@hostname // short/path/to/pwd/ - // $ + // $ _ let default = "\\n\\e[1;0m\\u\\e[1;36m@\\e[1;31m\\h\\n\\e[1;36m\\W\\e[1;32m/\\n\\e[1;32m\\$\\e[0m "; - return Ok(format!("{}",expand_prompt(default)?)) + return expand_prompt(default) }; - Ok(format!("\n{}",expand_prompt(&prompt)?)) + expand_prompt(&prompt) } pub fn read_line(edit_mode: FernEditMode) -> ShResult { let prompt = get_prompt()?; let mut reader: Box = match edit_mode { - FernEditMode::Vi => Box::new(FernVi::new(Some(prompt))), + FernEditMode::Vi => Box::new(FernVi::new(Some(prompt))?), FernEditMode::Emacs => todo!() }; reader.readline() diff --git a/src/prompt/readline/history.rs b/src/prompt/readline/history.rs new file mode 100644 index 0000000..41984d4 --- /dev/null +++ b/src/prompt/readline/history.rs @@ -0,0 +1,258 @@ +use std::{env, fmt::{Write,Display}, fs::{self, OpenOptions}, io::Write as IoWrite, path::{Path, PathBuf}, str::FromStr, time::{Duration, SystemTime, UNIX_EPOCH}}; + +use crate::libsh::error::{ShErr, ShErrKind, ShResult}; +use crate::prelude::*; + +use super::vicmd::Direction; // surprisingly useful + +#[derive(Debug)] +pub struct HistEntry { + id: u32, + timestamp: SystemTime, + command: String, + new: bool +} + +impl HistEntry { + pub fn id(&self) -> u32 { + self.id + } + pub fn timestamp(&self) -> &SystemTime { + &self.timestamp + } + pub fn command(&self) -> &str { + &self.command + } + fn with_escaped_newlines(&self) -> String { + let mut escaped = String::new(); + let mut chars = self.command.chars(); + while let Some(ch) = chars.next() { + match ch { + '\\' => { + escaped.push(ch); + if let Some(ch) = chars.next() { + escaped.push(ch) + } + } + '\n' => { + escaped.push_str("\\\n"); + } + _ => escaped.push(ch), + } + } + escaped + } +} + +impl FromStr for HistEntry { + type Err = ShErr; + fn from_str(s: &str) -> Result { + let err = Err( + ShErr::Simple { kind: ShErrKind::HistoryReadErr, msg: format!("Bad formatting on history entry '{s}'"), notes: vec![] } + ); + + //: 248972349;148;echo foo; echo bar + let Some(cleaned) = s.strip_prefix(": ") else { return err }; + //248972349;148;echo foo; echo bar + let Some((timestamp,id_and_command)) = cleaned.split_once(';') else { return err }; + //("248972349","148;echo foo; echo bar") + let Some((id,command)) = id_and_command.split_once(';') else { return err }; + //("148","echo foo; echo bar") + let Ok(ts_seconds) = timestamp.parse::() else { return err }; + let Ok(id) = id.parse::() else { return err }; + let timestamp = UNIX_EPOCH + Duration::from_secs(ts_seconds); + let command = command.to_string(); + Ok(Self { id, timestamp, command, new: false }) + } +} + +impl Display for HistEntry { + /// Similar to zsh's history format, but not entirely + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let command = self.with_escaped_newlines(); + let HistEntry { id, timestamp, command: _, new: _ } = self; + let timestamp = timestamp.duration_since(UNIX_EPOCH).unwrap().as_secs(); + writeln!(f, ": {timestamp};{id};{command}") + } +} + +pub struct HistEntries(Vec); + + +impl FromStr for HistEntries { + type Err = ShErr; + fn from_str(s: &str) -> Result { + let mut entries = vec![]; + + let mut lines = s.lines().enumerate().peekable(); + let mut cur_line = String::new(); + + while let Some((i,line)) = lines.next() { + if !line.starts_with(": ") { + return Err( + ShErr::Simple { kind: ShErrKind::HistoryReadErr, msg: format!("Bad formatting on line {i}"), notes: vec![] } + ) + } + let mut chars = line.chars().peekable(); + let mut feeding_lines = true; + while feeding_lines { + feeding_lines = false; + while let Some(ch) = chars.next() { + match ch { + '\\' => { + if let Some(esc_ch) = chars.next() { + cur_line.push(esc_ch); + } else { + cur_line.push('\n'); + feeding_lines = true; + } + } + '\n' => { + break + } + _ => { + cur_line.push(ch); + } + } + } + if feeding_lines { + let Some((_,line)) = lines.next() else { + return Err( + ShErr::Simple { kind: ShErrKind::HistoryReadErr, msg: format!("Bad formatting on line {i}"), notes: vec![] } + ) + }; + chars = line.chars().peekable(); + } + } + let entry = cur_line.parse::()?; + entries.push(entry); + cur_line.clear(); + } + + + Ok(Self(entries)) + } +} + +fn read_hist_file(path: &Path) -> ShResult> { + if !path.exists() { + fs::File::create(path)?; + } + let raw = fs::read_to_string(path)?; + Ok(raw.parse::()?.0) +} + +pub struct History { + path: PathBuf, + entries: Vec, + cursor: usize, + search_direction: Direction, + ignore_dups: bool, + max_size: Option, +} + +impl History { + pub fn new() -> ShResult { + let path = PathBuf::from(env::var("FERNHIST").unwrap_or({ + let home = env::var("HOME").unwrap(); + format!("{home}/.fern_history") + })); + let entries = read_hist_file(&path)?; + let cursor = entries.len(); + let mut new = Self { + path, + entries, + cursor, + search_direction: Direction::Backward, + ignore_dups: true, + max_size: None, + }; + new.push_empty_entry(); // Current pending command + Ok(new) + } + + pub fn entries(&self) -> &[HistEntry] { + &self.entries + } + + pub fn push_empty_entry(&mut self) { + let id = self.get_new_id(); + let timestamp = SystemTime::now(); + let command = "".into(); + self.entries.push(HistEntry { id, timestamp, command, new: true }) + } + + pub fn update_pending_cmd(&mut self, command: &str) { + flog!(DEBUG, "updating command"); + let Some(ent) = self.last_mut() else { + return + }; + + ent.command = command.to_string() + } + + pub fn last_mut(&mut self) -> Option<&mut HistEntry> { + self.entries.last_mut() + } + + pub fn get_new_id(&self) -> u32 { + let Some(ent) = self.entries.last() else { + return 0 + }; + ent.id + 1 + } + + pub fn ignore_dups(&mut self, yn: bool) { + self.ignore_dups = yn + } + + pub fn max_hist_size(&mut self, size: Option) { + self.max_size = size + } + + pub fn scroll(&mut self, offset: isize) -> Option<&HistEntry> { + let new_idx = self.cursor + .saturating_add_signed(offset) + .clamp(0, self.entries.len()); + let ent = self.entries.get(new_idx)?; + + self.cursor = new_idx; + + Some(ent) + } + + pub fn push(&mut self, command: String) { + let timestamp = SystemTime::now(); + let id = self.get_new_id(); + if self.ignore_dups && self.is_dup(&command) { + return + } + self.entries.push(HistEntry { id, timestamp, command, new: true }); + } + + pub fn is_dup(&self, other: &str) -> bool { + let Some(ent) = self.entries.last() else { + return false + }; + let ent_cmd = &ent.command; + ent_cmd == other + } + + pub fn save(&mut self) -> ShResult<()> { + let mut file = OpenOptions::new() + .create(true) + .append(true) + .open(&self.path)?; + + let entries = self.entries.iter_mut().filter(|ent| ent.new); + let mut data = String::new(); + for ent in entries { + ent.new = false; + write!(data, "{ent}").unwrap(); + } + + file.write_all(data.as_bytes())?; + + Ok(()) + } +} diff --git a/src/prompt/readline/linebuf.rs b/src/prompt/readline/linebuf.rs index e3cda72..3eb1406 100644 --- a/src/prompt/readline/linebuf.rs +++ b/src/prompt/readline/linebuf.rs @@ -138,6 +138,10 @@ impl Edit { pub fn stop_merge(&mut self) { self.merging = false } + pub fn is_empty(&self) -> bool { + self.new.is_empty() && + self.old.is_empty() + } } #[derive(Default,Debug)] @@ -151,11 +155,12 @@ pub struct LineBuf { move_cursor_on_undo: bool, undo_stack: Vec, redo_stack: Vec, + tab_stop: usize } impl LineBuf { pub fn new() -> Self { - Self::default() + Self { tab_stop: 8, ..Default::default() } } pub fn with_initial(mut self, initial: &str) -> Self { self.buffer = initial.to_string(); @@ -167,6 +172,9 @@ impl LineBuf { pub fn as_str(&self) -> &str { &self.buffer } + pub fn saved_col(&self) -> Option { + self.saved_col + } pub fn update_term_dims(&mut self, dims: (usize,usize)) { self.term_dims = dims } @@ -181,6 +189,9 @@ impl LineBuf { pub fn byte_len(&self) -> usize { self.buffer.len() } + pub fn undos(&self) -> usize { + self.undo_stack.len() + } pub fn is_empty(&self) -> bool { self.buffer.is_empty() } @@ -195,11 +206,21 @@ impl LineBuf { self.cursor_back(1); } } + pub fn clamp_range(&self, range: Range) -> Range { + let (mut start,mut end) = (range.start,range.end); + start = start.max(0); + end = end.min(self.byte_len()); + start..end + } pub fn grapheme_len(&self) -> usize { self.buffer.grapheme_indices(true).count() } pub fn slice_from_cursor(&self) -> &str { - &self.buffer[self.cursor..] + if let Some(slice) = &self.buffer.get(self.cursor..) { + slice + } else { + "" + } } pub fn slice_to_cursor(&self) -> &str { if let Some(slice) = self.buffer.get(..self.cursor) { @@ -291,6 +312,11 @@ impl LineBuf { .map(|(i, _)| i) } } + pub fn sync_cursor(&mut self) { + if !self.buffer.is_char_boundary(self.cursor) { + self.cursor = self.prev_pos(1).unwrap_or(0) + } + } pub fn cursor_back(&mut self, dist: usize) -> bool { let Some(pos) = self.prev_pos(dist) else { return false @@ -298,6 +324,35 @@ impl LineBuf { self.cursor = pos; true } + /// Constrain the cursor to the current line + pub fn cursor_back_confined(&mut self, dist: usize) -> bool { + for _ in 0..dist { + let Some(pos) = self.prev_pos(1) else { + return false + }; + if let Some("\n") = self.grapheme_at(pos) { + return false + } + if !self.cursor_back(1) { + return false + } + } + true + } + pub fn cursor_fwd_confined(&mut self, dist: usize) -> bool { + for _ in 0..dist { + let Some(pos) = self.next_pos(1) else { + return false + }; + if let Some("\n") = self.grapheme_at(pos) { + return false + } + if !self.cursor_fwd(1) { + return false + } + } + true + } /// Up to but not including 'dist' pub fn cursor_back_to(&mut self, dist: usize) -> bool { let dist = dist.saturating_sub(1); @@ -322,77 +377,89 @@ impl LineBuf { self.cursor = pos; true } + + fn compute_display_positions<'a>( + text: impl Iterator, + start_col: usize, + tab_stop: usize, + term_width: usize, + ) -> (usize, usize) { + let mut lines = 0; + let mut col = start_col; + + for grapheme in text { + match grapheme { + "\n" => { + lines += 1; + col = 1; + } + "\t" => { + let spaces_to_next_tab = tab_stop - (col % tab_stop); + if col + spaces_to_next_tab > term_width { + lines += 1; + col = 1; + } else { + col += spaces_to_next_tab; + } + + // Don't ask why this is here + // I don't know either + // All I know is that it only finds the correct cursor position + // if i add one to the column here, for literally no reason + // Thank you linux terminal :) + col += 1; + } + _ => { + col += grapheme.width(); + if col > term_width { + lines += 1; + col = 1; + } + } + } + } + + (lines, col) + } pub fn count_display_lines(&self, offset: usize, term_width: usize) -> usize { - let mut lines = 0; - let mut col = offset.max(1); - for ch in self.buffer.chars() { - match ch { - '\n' => { - lines += 1; - col = 1; - } - _ => { - col += 1; - if col > term_width { - lines += 1; - col = 1 - } - } - } - } + let (lines, _) = Self::compute_display_positions( + self.buffer.graphemes(true), + offset.max(1), + self.tab_stop, + term_width, + ); lines } + pub fn cursor_display_line_position(&self, offset: usize, term_width: usize) -> usize { - let mut lines = 0; - let mut col = offset.max(1); - for ch in self.slice_to_cursor().chars() { - match ch { - '\n' => { - lines += 1; - col = 1; - } - _ => { - col += 1; - if col > term_width { - lines += 1; - col = 1 - } - } - } - } + let (lines, _) = Self::compute_display_positions( + self.slice_to_cursor().graphemes(true), + offset.max(1), + self.tab_stop, + term_width, + ); lines } - pub fn display_coords(&self, term_width: usize) -> (usize,usize) { - let chars = self.slice_to_cursor().chars(); - let mut lines = 0; - let mut col = 0; - for ch in chars { - match ch { - '\n' => { - lines += 1; - col = 1; - } - _ => { - col += 1; - if col > term_width { - lines += 1; - col = 1 - } - } - } - } - (lines,col) + pub fn display_coords(&self, term_width: usize) -> (usize, usize) { + Self::compute_display_positions( + self.slice_to_cursor().graphemes(true), + 0, + self.tab_stop, + term_width, + ) } - pub fn cursor_display_coords(&self, term_width: usize) -> (usize,usize) { - let (d_line,mut d_col) = self.display_coords(term_width); - let line = self.count_display_lines(self.first_line_offset, term_width) - d_line; - if line == self.count_lines() { + pub fn cursor_display_coords(&self, term_width: usize) -> (usize, usize) { + let (d_line, mut d_col) = self.display_coords(term_width); + let total_lines = self.count_display_lines(self.first_line_offset, term_width); + let logical_line = total_lines - d_line; + + if logical_line == self.count_lines() { d_col += self.first_line_offset; } - (line,d_col) + (logical_line, d_col) } pub fn insert(&mut self, ch: char) { if self.buffer.is_empty() { @@ -471,6 +538,20 @@ impl LineBuf { self.end_of_line() ) } + pub fn prev_line(&self, offset: usize) -> (usize,usize) { + let (start,_) = self.select_lines_up(offset); + let end = self.slice_from_cursor().find('\n').unwrap_or(self.byte_len()); + (start,end) + } + pub fn next_line(&self, offset: usize) -> Option<(usize,usize)> { + if self.this_line().1 == self.byte_len() { + return None + } + let (_,mut end) = self.select_lines_down(offset); + end = end.min(self.byte_len().saturating_sub(1)); + let start = self.slice_to(end + 1).rfind('\n').unwrap_or(0); + Some((start,end)) + } pub fn count_lines(&self) -> usize { self.buffer .chars() @@ -522,8 +603,9 @@ impl LineBuf { } for _ in 0..n { - if let Some(prev_newline) = self.slice_to(start - 1).rfind('\n') { - start = prev_newline + 1; + let slice = self.slice_to(start - 1); + if let Some(prev_newline) = slice.rfind('\n') { + start = prev_newline; } else { start = 0; break @@ -548,9 +630,14 @@ impl LineBuf { return (start,end) } - for _ in 0..n { - if let Some(next_newline) = self.slice_from(end).find('\n') { - end = next_newline + for _ in 0..=n { + let next_ln_start = end + 1; + if next_ln_start >= self.byte_len() { + end = self.byte_len(); + break + } + if let Some(next_newline) = self.slice_from(next_ln_start).find('\n') { + end += next_newline; } else { end = self.byte_len(); break @@ -626,6 +713,9 @@ impl LineBuf { Direction::Forward => { match to { To::Start => { + if self.on_whitespace() { + return self.find_from(pos, |c| CharClass::from(c) != CharClass::Whitespace) + } if self.on_start_of_word(word) { pos += 1; if pos >= self.byte_len() { @@ -637,6 +727,9 @@ impl LineBuf { Some(word_start) } To::End => { + if self.on_whitespace() { + pos = self.find_from(pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + } match self.on_end_of_word(word) { true => { pos += 1; @@ -662,6 +755,9 @@ impl LineBuf { Direction::Backward => { match to { To::Start => { + if self.on_whitespace() { + pos = self.rfind_from(pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + } match self.on_start_of_word(word) { true => { pos = pos.checked_sub(1)?; @@ -680,6 +776,9 @@ impl LineBuf { } } To::End => { + if self.on_whitespace() { + return self.rfind_from(pos, |c| CharClass::from(c) != CharClass::Whitespace) + } if self.on_end_of_word(word) { pos = pos.checked_sub(1)?; } @@ -696,6 +795,9 @@ impl LineBuf { Direction::Forward => { match to { To::Start => { + if self.on_whitespace() { + return self.find_from(pos, |c| CharClass::from(c) != CharClass::Whitespace) + } if self.on_start_of_word(word) { pos += 1; if pos >= self.byte_len() { @@ -712,6 +814,9 @@ impl LineBuf { } } To::End => { + if self.on_whitespace() { + pos = self.find_from(pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + } match self.on_end_of_word(word) { true => { pos += 1; @@ -752,6 +857,9 @@ impl LineBuf { Direction::Backward => { match to { To::Start => { + if self.on_whitespace() { + pos = self.rfind_from(pos, |c| CharClass::from(c) != CharClass::Whitespace)?; + } match self.on_start_of_word(word) { true => { pos = pos.checked_sub(1)?; @@ -772,6 +880,9 @@ impl LineBuf { } } To::End => { + if self.on_whitespace() { + return self.rfind_from(pos, |c| CharClass::from(c) != CharClass::Whitespace) + } if self.on_end_of_word(word) { pos = pos.checked_sub(1)?; } @@ -829,10 +940,7 @@ impl LineBuf { } pub fn eval_motion(&mut self, motion: Motion) -> MotionKind { match motion { - Motion::WholeLine => { - let (start,end) = self.this_line(); - MotionKind::range(start..=end) - } + Motion::WholeLine => MotionKind::Line(0), Motion::TextObj(text_obj, bound) => todo!(), Motion::BeginningOfFirstWord => { let (start,_) = self.this_line(); @@ -962,7 +1070,7 @@ impl LineBuf { .map(|(_, byte_idx, _)| *byte_idx) } pub fn get_range_from_motion(&self, verb: &Verb, motion: &MotionKind) -> Option> { - match motion { + let range = match motion { MotionKind::Forward(n) => { let pos = self.next_pos(*n)?; let range = self.cursor..pos; @@ -983,17 +1091,36 @@ impl LineBuf { Some(range.0..range.1) } MotionKind::Line(n) => { - let (start,end) = match n.cmp(&0) { - Ordering::Less => self.select_lines_up(n.unsigned_abs()), - Ordering::Equal => self.this_line(), - Ordering::Greater => self.select_lines_down(*n as usize) - }; - let range = match verb { - Verb::Change => mk_range(start,end), - Verb::Delete => mk_range(start,(end + 1).min(self.byte_len())), - _ => unreachable!() - }; - Some(range) + match n.cmp(&0) { + Ordering::Less => { + let (start,end) = self.select_lines_up(n.unsigned_abs()); + let mut range = match verb { + Verb::Delete => mk_range_inclusive(start,end), + _ => mk_range(start,end), + }; + range = self.clamp_range(range); + Some(range) + } + Ordering::Equal => { + let (start,end) = self.this_line(); + let mut range = match verb { + Verb::Delete => mk_range_inclusive(start,end), + _ => mk_range(start,end), + }; + range = self.clamp_range(range); + Some(range) + } + Ordering::Greater => { + let (start, mut end) = self.select_lines_down(*n as usize); + end = (end + 1).min(self.byte_len() - 1); + let mut range = match verb { + Verb::Delete => mk_range_inclusive(start,end), + _ => mk_range(start,end), + }; + range = self.clamp_range(range); + Some(range) + } + } } MotionKind::ToLine(n) => { let (start,end) = self.select_lines_to(*n); @@ -1009,7 +1136,35 @@ impl LineBuf { let pos = self.calculate_display_offset(*n)?; Some(mk_range(pos, self.cursor)) } + }; + range.map(|rng| self.clamp_range(rng)) + } + pub fn indent_lines(&mut self, range: Range) { + let (start,end) = (range.start,range.end); + + self.buffer.insert(start, '\t'); + + let graphemes = self.buffer[start + 1..end].grapheme_indices(true); + let mut tab_insert_indices = vec![]; + let mut next_is_tab_pos = false; + for (i,g) in graphemes { + if g == "\n" { + next_is_tab_pos = true; + } else if next_is_tab_pos { + tab_insert_indices.push(start + i + 1); + next_is_tab_pos = false; + } } + + for i in tab_insert_indices { + if i < self.byte_len() { + self.buffer.insert(i, '\t'); + } + } + } + pub fn dedent_lines(&mut self, range: Range) { + + todo!() } pub fn exec_verb(&mut self, verb: Verb, motion: MotionKind, register: RegisterName) -> ShResult<()> { match verb { @@ -1018,9 +1173,21 @@ impl LineBuf { let Some(range) = self.get_range_from_motion(&verb, &motion) else { return Ok(()) }; + let restore_col = matches!(motion, MotionKind::Line(_)) && matches!(verb, Verb::Delete); + if restore_col { + self.saved_col = Some(self.cursor_column()) + } + let deleted = self.buffer.drain(range.clone()); register.write_to_register(deleted.collect()); + self.cursor = range.start; + if restore_col { + let saved = self.saved_col.unwrap(); + let line_start = self.this_line().0; + + self.cursor = line_start + saved; + } } Verb::DeleteChar(anchor) => { match anchor { @@ -1078,7 +1245,6 @@ impl LineBuf { let Some(undo) = self.undo_stack.pop() else { return Ok(()) }; - flog!(DEBUG, undo); let Edit { pos, cursor_pos, old, new, .. } = undo; let range = pos..pos + new.len(); self.buffer.replace_range(range, &old); @@ -1093,7 +1259,6 @@ impl LineBuf { let Some(redo) = self.redo_stack.pop() else { return Ok(()) }; - flog!(DEBUG, redo); let Edit { pos, cursor_pos, old, new, .. } = redo; let range = pos..pos + new.len(); self.buffer.replace_range(range, &old); @@ -1139,10 +1304,28 @@ impl LineBuf { } } } - Verb::JoinLines => todo!(), + Verb::JoinLines => { + let (start,end) = self.this_line(); + let Some((nstart,nend)) = self.next_line(1) else { + return Ok(()) + }; + let line = &self.buffer[start..end]; + let next_line = &self.buffer[nstart..nend].trim_start().to_string(); // strip leading whitespace + flog!(DEBUG,next_line); + let replace_newline_with_space = !line.ends_with([' ', '\t']); + + self.cursor = end; + if replace_newline_with_space { + self.buffer.replace_range(end..end+1, " "); + self.buffer.replace_range(end+1..nend, next_line); + } else { + self.buffer.replace_range(end..end+1, ""); + self.buffer.replace_range(end..nend, next_line); + } + } Verb::InsertChar(ch) => { self.insert(ch); - self.apply_motion(motion); + self.apply_motion(/*forced*/ true, motion); } Verb::Insert(str) => { for ch in str.chars() { @@ -1151,8 +1334,18 @@ impl LineBuf { } } Verb::Breakline(anchor) => todo!(), - Verb::Indent => todo!(), - Verb::Dedent => todo!(), + Verb::Indent => { + let Some(range) = self.get_range_from_motion(&verb, &motion) else { + return Ok(()) + }; + self.indent_lines(range) + } + Verb::Dedent => { + let Some(range) = self.get_range_from_motion(&verb, &motion) else { + return Ok(()) + }; + self.dedent_lines(range) + } Verb::Equalize => todo!(), // I fear this one Verb::Builder(verb_builder) => todo!(), Verb::EndOfFile => { @@ -1170,23 +1363,31 @@ impl LineBuf { Verb::NormalMode | Verb::VisualMode => { /* Already handled */ - self.apply_motion(motion); + self.apply_motion(/*forced*/ true,motion); } } Ok(()) } - pub fn apply_motion(&mut self, motion: MotionKind) { + pub fn apply_motion(&mut self, forced: bool, motion: MotionKind) { match motion { MotionKind::Forward(n) => { for _ in 0..n { - if !self.cursor_fwd(1) { + if forced { + if !self.cursor_fwd(1) { + break + } + } else if !self.cursor_fwd_confined(1) { break } } } MotionKind::Backward(n) => { for _ in 0..n { - if !self.cursor_back(1) { + if forced { + if !self.cursor_back(1) { + break + } + } else if !self.cursor_back_confined(1) { break } } @@ -1206,28 +1407,22 @@ impl LineBuf { } MotionKind::Line(n) => { match n.cmp(&0) { - Ordering::Equal => { - let (start,_) = self.this_line(); - if start == 0 { - return - } - self.cursor = start; - } + Ordering::Equal => (), Ordering::Less => { - let (start,_) = self.select_lines_up(n.unsigned_abs()); - if start == 0 { - return + for _ in 0..n.unsigned_abs() { + let Some(pos) = self.find_prev_line_pos() else { + return + }; + self.cursor = pos; } - self.cursor = start; } Ordering::Greater => { - let (_,end) = self.select_lines_down(n.unsigned_abs()); - if end == self.byte_len() { - return + for _ in 0..n.unsigned_abs() { + let Some(pos) = self.find_next_line_pos() else { + return + }; + self.cursor = pos; } - self.cursor = end.saturating_sub(1); - let (start,_) = self.this_line(); - self.cursor = start; } } } @@ -1252,6 +1447,9 @@ impl LineBuf { pub fn handle_edit(&mut self, old: String, new: String, curs_pos: usize) { if self.edit_is_merging() { let diff = Edit::diff(&old, &new, curs_pos); + if diff.is_empty() { + return + } let Some(mut edit) = self.undo_stack.pop() else { self.undo_stack.push(diff); return @@ -1263,7 +1461,9 @@ impl LineBuf { self.undo_stack.push(edit); } else { let diff = Edit::diff(&old, &new, curs_pos); - self.undo_stack.push(diff); + if !diff.is_empty() { + self.undo_stack.push(diff); + } } } pub fn exec_cmd(&mut self, cmd: ViCmd) -> ShResult<()> { @@ -1278,10 +1478,6 @@ impl LineBuf { edit.stop_merge(); } } - if clear_redos { - flog!(DEBUG, "clearing redos"); - flog!(DEBUG,cmd); - } let ViCmd { register, verb, motion, .. } = cmd; @@ -1301,7 +1497,7 @@ impl LineBuf { if let Some(verb) = verb.clone() { self.exec_verb(verb.1, motion, register)?; } else { - self.apply_motion(motion); + self.apply_motion(/*forced*/ false,motion); } } } @@ -1328,6 +1524,7 @@ impl LineBuf { if self.clamp_cursor { self.clamp_cursor(); } + self.sync_cursor(); Ok(()) } } @@ -1368,6 +1565,11 @@ pub fn is_grapheme_boundary(s: &str, pos: usize) -> bool { s.is_char_boundary(pos) && s.grapheme_indices(true).any(|(i,_)| i == pos) } +fn mk_range_inclusive(a: usize, b: usize) -> Range { + let b = b + 1; + std::cmp::min(a, b)..std::cmp::max(a, b) +} + fn mk_range(a: usize, b: usize) -> Range { std::cmp::min(a, b)..std::cmp::max(a, b) } diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index afd53ee..27f1674 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -1,11 +1,12 @@ use std::time::Duration; +use history::History; use keys::{KeyCode, KeyEvent, ModKeys}; use linebuf::{strip_ansi_codes_and_escapes, LineBuf}; use mode::{CmdReplay, ViInsert, ViMode, ViNormal, ViReplace}; use term::Terminal; use unicode_width::UnicodeWidthStr; -use vicmd::{Motion, MotionCmd, RegisterName, Verb, VerbCmd, ViCmd}; +use vicmd::{Motion, MotionCmd, RegisterName, To, Verb, VerbCmd, ViCmd}; use crate::libsh::{error::{ShErr, ShErrKind, ShResult}, term::{Style, Styled}}; use crate::prelude::*; @@ -16,6 +17,9 @@ pub mod linebuf; pub mod vicmd; pub mod mode; pub mod register; +pub mod history; + +const LOREM_IPSUM: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore\nmagna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\nconsequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; /// Unified interface for different line editing methods pub trait Readline { @@ -25,6 +29,7 @@ pub trait Readline { pub struct FernVi { term: Terminal, line: LineBuf, + history: History, prompt: String, mode: Box, last_action: Option, @@ -54,41 +59,68 @@ impl Readline for FernVi { */ self.print_buf(false)?; loop { - let key = self.term.read_key(); + if let KeyEvent(KeyCode::Char('V'), ModKeys::CTRL) = key { - self.handle_verbatim(); + self.handle_verbatim()?; continue } + let Some(cmd) = self.mode.handle_key(key) else { continue }; - if cmd.should_submit() { - self.term.write("\n"); - return Ok(self.line.to_string()); + if self.should_grab_history(&cmd) { + flog!(DEBUG, "scrolling"); + self.scroll_history(cmd); + self.print_buf(true)?; + continue } + + if cmd.should_submit() { + self.term.write("\n"); + let command = self.line.to_string(); + if !command.is_empty() { + // We're just going to trim the command + // reduces clutter in the case of two history commands whose only difference is insignificant whitespace + self.history.push(command.trim().to_string()); + self.history.save()?; + } + return Ok(command); + } + let line = self.line.to_string(); self.exec_cmd(cmd.clone())?; + let new_line = self.line.as_str(); + let has_changes = line != new_line; + flog!(DEBUG, has_changes); + + if cmd.verb().is_some_and(|v| v.1.is_edit()) && has_changes { + self.history.update_pending_cmd(self.line.as_str()); + } + self.print_buf(true)?; } } } impl FernVi { - pub fn new(prompt: Option) -> Self { + pub fn new(prompt: Option) -> ShResult { let prompt = prompt.unwrap_or("$ ".styled(Style::Green | Style::Bold)); - let line = LineBuf::new().with_initial("The quick brown fox jumps over the lazy dog");//\nThe quick brown fox jumps over the lazy dog\nThe quick brown fox jumps over the lazy dog\n"); + let line = LineBuf::new().with_initial(LOREM_IPSUM); let term = Terminal::new(); - Self { + let history = History::new()?; + Ok(Self { term, line, + history, prompt, mode: Box::new(ViInsert::new()), last_action: None, last_movement: None, - } + }) } + /// Ctrl+V handler pub fn handle_verbatim(&mut self) -> ShResult<()> { let mut buf = [0u8; 8]; let mut collected = Vec::new(); @@ -151,6 +183,62 @@ impl FernVi { } Ok(()) } + pub fn scroll_history(&mut self, cmd: ViCmd) { + let count = &cmd.motion().unwrap().0; + let motion = &cmd.motion().unwrap().1; + flog!(DEBUG,count,motion); + let entry = match motion { + Motion::LineUp => { + let Some(hist_entry) = self.history.scroll(-(*count as isize)) else { + return + }; + flog!(DEBUG,"found entry"); + flog!(DEBUG,hist_entry.command()); + hist_entry + } + Motion::LineDown => { + let Some(hist_entry) = self.history.scroll(*count as isize) else { + return + }; + flog!(DEBUG,"found entry"); + flog!(DEBUG,hist_entry.command()); + hist_entry + } + _ => unreachable!() + }; + let col = self.line.saved_col().unwrap_or(self.line.cursor_column()); + let mut buf = LineBuf::new().with_initial(entry.command()); + let line_end = buf.end_of_line(); + if let Some(dest) = self.mode.hist_scroll_start_pos() { + match dest { + To::Start => { + /* Already at 0 */ + } + To::End => { + // History entries cannot be empty + // So this subtraction is safe (maybe) + buf.cursor_fwd_to(line_end + 1); + } + } + } else { + let target = (col + 1).min(line_end + 1); + buf.cursor_fwd_to(target); + } + + self.line = buf + } + + pub fn should_grab_history(&self, cmd: &ViCmd) -> bool { + cmd.verb().is_none() && + ( + cmd.motion().is_some_and(|m| matches!(m, MotionCmd(_, Motion::LineUp))) && + self.line.start_of_line() == 0 + ) || + ( + cmd.motion().is_some_and(|m| matches!(m, MotionCmd(_, Motion::LineDown))) && + self.line.end_of_line() == self.line.byte_len() + ) + } pub fn print_buf(&mut self, refresh: bool) -> ShResult<()> { let (height,width) = self.term.get_dimensions()?; if refresh { @@ -228,7 +316,7 @@ impl FernVi { v_mut.0 = count } if let Some(m_mut) = cmd.motion.as_mut() { - m_mut.0 = 0 + m_mut.0 = 1 } } else { return Ok(()) // it has to have a verb to be repeatable, something weird happened diff --git a/src/prompt/readline/mode.rs b/src/prompt/readline/mode.rs index f7f9ff7..97d2a38 100644 --- a/src/prompt/readline/mode.rs +++ b/src/prompt/readline/mode.rs @@ -40,6 +40,7 @@ pub trait ViMode { fn pending_seq(&self) -> Option; fn move_cursor_on_undo(&self) -> bool; fn clamp_cursor(&self) -> bool; + fn hist_scroll_start_pos(&self) -> Option; } #[derive(Default,Debug)] @@ -145,6 +146,9 @@ impl ViMode for ViInsert { fn clamp_cursor(&self) -> bool { false } + fn hist_scroll_start_pos(&self) -> Option { + Some(To::End) + } } #[derive(Default,Debug)] @@ -245,6 +249,9 @@ impl ViMode for ViReplace { fn clamp_cursor(&self) -> bool { true } + fn hist_scroll_start_pos(&self) -> Option { + Some(To::End) + } } #[derive(Default,Debug)] pub struct ViNormal { @@ -295,7 +302,9 @@ impl ViNormal { } } /// End the parse and clear the pending sequence + #[track_caller] pub fn quit_parse(&mut self) -> Option { + flog!(DEBUG, std::panic::Location::caller()); flog!(WARN, "exiting parse early with sequence: {}",self.pending_seq); self.clear_cmd(); None @@ -359,6 +368,14 @@ impl ViNormal { chars = chars_clone; break 'verb_parse Some(VerbCmd(count, Verb::Put(Anchor::Before))); } + '>' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::Indent)); + } + '<' => { + chars = chars_clone; + break 'verb_parse Some(VerbCmd(count, Verb::Dedent)); + } 'r' => { let ch = chars_clone.next()?; return Some( @@ -460,6 +477,16 @@ impl ViNormal { } ) } + 'J' => { + return Some( + ViCmd { + register, + verb: Some(VerbCmd(count, Verb::JoinLines)), + motion: None, + raw_seq: self.take_cmd() + } + ) + } 'y' => { chars = chars_clone; break 'verb_parse Some(VerbCmd(count, Verb::Yank)) @@ -521,6 +548,7 @@ impl ViNormal { ('d', Some(VerbCmd(_,Verb::Delete))) | ('c', Some(VerbCmd(_,Verb::Change))) | ('y', Some(VerbCmd(_,Verb::Yank))) | + ('=', Some(VerbCmd(_,Verb::Equalize))) | ('>', Some(VerbCmd(_,Verb::Indent))) | ('<', Some(VerbCmd(_,Verb::Dedent))) => break 'motion_parse Some(MotionCmd(count, Motion::WholeLine)), _ => {} @@ -763,6 +791,9 @@ impl ViMode for ViNormal { fn clamp_cursor(&self) -> bool { true } + fn hist_scroll_start_pos(&self) -> Option { + None + } } pub fn common_cmds(key: E) -> Option { diff --git a/src/prompt/readline/term.rs b/src/prompt/readline/term.rs index 716222f..9e5f558 100644 --- a/src/prompt/readline/term.rs +++ b/src/prompt/readline/term.rs @@ -6,6 +6,7 @@ use std::mem::zeroed; use std::io; use crate::libsh::error::ShResult; +use crate::prelude::*; use super::keys::{KeyCode, KeyEvent, ModKeys}; @@ -195,6 +196,7 @@ impl Terminal { } pub fn position_cursor(&mut self, (lines,col): (usize,usize)) -> ShResult<()> { + flog!(DEBUG,lines); self.cursor_records.lines = lines; self.cursor_records.cols = col; self.cursor_records.offset = self.cursor_pos().1; @@ -250,7 +252,7 @@ impl Terminal { let tab_size = 8; let next_tab = tab_size - (self.write_records.cols % tab_size); self.write_records.cols += next_tab; - if self.write_records.cols >= width { + if self.write_records.cols > width { self.write_records.lines += 1; self.write_records.cols = 0; } diff --git a/src/prompt/readline/vicmd.rs b/src/prompt/readline/vicmd.rs index 741100e..0a251ff 100644 --- a/src/prompt/readline/vicmd.rs +++ b/src/prompt/readline/vicmd.rs @@ -223,6 +223,7 @@ impl Verb { } pub fn is_char_insert(&self) -> bool { matches!(self, + Self::Change | Self::InsertChar(_) | Self::ReplaceChar(_) )