├── .github └── workflows │ └── ci.yml ├── CODE_OF_CONDUCT.md ├── Gemfile ├── LICENSE ├── README.md ├── Rakefile ├── assets └── termtime.png ├── lib ├── termtime.rb └── termtime │ ├── db.rb │ ├── terminfo.rb │ └── version.rb ├── templates └── lib │ └── termtime │ └── db.rb.erb ├── termtime.gemspec └── test ├── fixtures ├── adm3 ├── adm3a └── xterm-256color ├── helper.rb └── terminfo_test.rb /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | runs-on: ${{ matrix.os }}-latest 8 | 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | os: [ubuntu, macos] 13 | ruby: [ head, 3.2 ] 14 | 15 | steps: 16 | - uses: actions/checkout@v3 17 | - name: Set up Ruby 18 | uses: ruby/setup-ruby@v1 19 | with: 20 | ruby-version: ${{ matrix.ruby }} 21 | 22 | - name: Install dependencies 23 | run: bundle install 24 | - name: Run tests 25 | run: bundle exec rake test 26 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to make participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies within all project spaces, and it also applies when 49 | an individual is representing the project or its community in public spaces. 50 | Examples of representing a project or community include using an official 51 | project e-mail address, posting via an official social media account, or acting 52 | as an appointed representative at an online or offline event. Representation of 53 | a project may be further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at aaron.patterson at gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | 78 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gemspec 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2024 Aaron Patterson 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TermTime 2 | 3 | TermTime is a pure Ruby terminfo library. You can use it to get information 4 | about your terminal, and print cool stuff! 5 | 6 | Here is an example that prints random colored characters to your display: 7 | 8 | ```ruby 9 | require "termtime" 10 | require "io/console" 11 | 12 | tty = IO.console 13 | y, x = tty.winsize 14 | 15 | trap("WINCH") { y, x = tty.winsize } 16 | 17 | ti = TermTime::TermInfo.new 18 | 19 | begin 20 | loop do 21 | print ti.str("cup").tparm(rand(y), rand(x)) 22 | print ti.str("setaf").tparm(rand(255)) 23 | print "#" 24 | sleep 0.01 25 | end 26 | ensure 27 | print ti.str("sgr0").value 28 | puts 29 | end 30 | ``` 31 | 32 | Running the above program will make your terminal look something like this: 33 | 34 | ![Program Output, terminal with random colored characters](assets/termtime.png) 35 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'rake/clean' 2 | require 'rake/testtask' 3 | 4 | CLOBBER << "tmp/Caps" 5 | CLOBBER << "tmp" 6 | 7 | file "tmp/Caps" do 8 | require "net/http" 9 | 10 | mkdir_p "tmp" 11 | url = URI("https://raw.githubusercontent.com/ThomasDickey/ncurses-snapshots/refs/heads/master/include/Caps") 12 | res = Net::HTTP.get(url) 13 | File.binwrite "tmp/Caps", res 14 | end 15 | 16 | file "lib/termtime/db.rb" => "tmp/Caps" do |t| 17 | records = [] 18 | File.open("tmp/Caps") do |f| 19 | f.each_line do |line| 20 | break if line =~ /%%-STOP-HERE-%%/ 21 | 22 | if line !~ /^#/ 23 | records << line.chomp.gsub(/[\t]+/, "\t").split("\t") 24 | end 25 | end 26 | end 27 | 28 | info = records.group_by { |x| x[2] } 29 | 30 | require "erb" 31 | template = ERB.new(File.read("templates/#{t.name}.erb"), trim_mode: ">") 32 | File.binwrite t.name, template.result(binding) 33 | end 34 | 35 | task test: "lib/termtime/db.rb" 36 | 37 | Rake::TestTask.new do |t| 38 | t.libs << "test" 39 | t.test_files = FileList['test/*_test.rb'] 40 | t.verbose = true 41 | end 42 | -------------------------------------------------------------------------------- /assets/termtime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tenderlove/termtime/6fb740fda4badc563e804b8a46a6745d5898930e/assets/termtime.png -------------------------------------------------------------------------------- /lib/termtime.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "strscan" 4 | 5 | module TermTime 6 | autoload :TermInfo, "termtime/terminfo" 7 | autoload :DB, "termtime/db" 8 | 9 | def self.tparm fmt, p1 = 0, p2 = 0, p3 = 0, p4 = 0, p5 = 0, p6 = 0, p7 = 0, p8 = 0, p9 = 0 10 | return fmt unless fmt =~ /%/ 11 | 12 | regs = [p1, p2, p3, p4, p5, p6, p7, p8, p9] 13 | stack = [] 14 | 15 | scan = StringScanner.new fmt 16 | buff = ''.b 17 | 18 | while !scan.eos? 19 | start = scan.pos 20 | case 21 | when scan.skip(/%i/) 22 | regs[0] += 1 23 | regs[1] += 1 24 | when scan.skip(/%t/) 25 | if stack.pop == 0 26 | scan.skip_until(/%e/) 27 | else 28 | end 29 | when scan.skip(/%c/) 30 | buff << stack.pop 31 | when scan.skip(/%/) 36 | y = stack.pop 37 | x = stack.pop 38 | stack << (x > y ? 1 : 0) 39 | when scan.skip(/%\+/) then stack << (stack.pop + stack.pop) 40 | when scan.skip(/%\*/) then stack << (stack.pop * stack.pop) 41 | when scan.skip(/%-/) 42 | y = stack.pop 43 | x = stack.pop 44 | stack << (x - y) 45 | when scan.skip(/%\//) 46 | y = stack.pop 47 | x = stack.pop 48 | stack << (x / y) 49 | when scan.skip(/%m/) 50 | y = stack.pop 51 | x = stack.pop 52 | stack << (x % y) 53 | when scan.skip(/%!/) then stack << (stack.pop == 0 ? 1 : 0) 54 | when scan.skip(/%=/) then stack << (stack.pop == stack.pop ? 1 : 0) 55 | when scan.skip(/%%/) then buff << "%" 56 | when scan.skip(/%e/) 57 | # if we made it to %e, we must have been in the true branch, 58 | # so skip until after %; 59 | if !scan.skip_until(/%;/) 60 | break; 61 | end 62 | when scan.skip(/%l/) then raise NotImplementedError 63 | when scan.skip(/%&/) then stack << (stack.pop & stack.pop) 64 | when scan.skip(/%\|/) then stack << (stack.pop | stack.pop) 65 | when scan.skip(/%\^/) then stack << (stack.pop ^ stack.pop) 66 | when scan.skip(/%~/) then stack << (~stack.pop) 67 | when scan.skip(/%'.'/) then stack << fmt.getbyte(start + 2) 68 | when scan.skip(/%A/) 69 | stack << (stack.pop != 0 && stack.pop != 0 ? 1 : 0) 70 | when scan.skip(/%O/) 71 | stack << (stack.pop != 0 || stack.pop != 0 ? 1 : 0) 72 | when scan.skip(/%[;?]/) 73 | when scan.skip(/%{\d+}/) 74 | stack << fmt.byteslice(start + 2, scan.pos - start - 3).to_i 75 | when scan.skip(/%p[0-9]/) 76 | stack.push regs[(fmt.getbyte(scan.pos - 1) - 0x30) - 1] 77 | when str = scan.scan(/%([0-9].[0-9])?[dsoxX]/) 78 | buff << sprintf(str, stack.pop) 79 | when str = scan.scan(/[^%]+/) 80 | buff << str 81 | else 82 | p scan 83 | raise 84 | end 85 | end 86 | buff 87 | end 88 | end 89 | -------------------------------------------------------------------------------- /lib/termtime/db.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # GENERATED FILE, DO NOT EDIT 4 | # :stopdoc: 5 | module TermTime 6 | module DB 7 | class Capability 8 | attr_reader :name, :tiname, :titype, :tcname, :key_name, :value, :flags, :desc, :i 9 | 10 | def initialize(name, tiname, titype, tcname, key_name, value, flags, desc, i) 11 | @name = name 12 | @tiname = tiname 13 | @titype = titype 14 | @tcname = tcname 15 | @key_name = key_name 16 | @value = value 17 | @flags = flags 18 | @desc = desc 19 | @i = i 20 | end 21 | end 22 | class Boolean < Capability; end 23 | class Number < Capability; end 24 | class String < Capability; end 25 | 26 | BOOLEANS = { 27 | "bw" => Boolean.new( 28 | "auto_left_margin", 29 | "bw", 30 | "bool", 31 | "bw", 32 | "-", 33 | "-", 34 | "YB-G-", 35 | "cub1 wraps from column 0 to last column", 36 | 0, 37 | ).freeze, 38 | "am" => Boolean.new( 39 | "auto_right_margin", 40 | "am", 41 | "bool", 42 | "am", 43 | "-", 44 | "-", 45 | "YBCGE", 46 | "terminal has automatic margins", 47 | 1, 48 | ).freeze, 49 | "xsb" => Boolean.new( 50 | "no_esc_ctlc", 51 | "xsb", 52 | "bool", 53 | "xb", 54 | "-", 55 | "-", 56 | "YBCG-", 57 | "beehive (f1=escape, f2=ctrl C)", 58 | 2, 59 | ).freeze, 60 | "xhp" => Boolean.new( 61 | "ceol_standout_glitch", 62 | "xhp", 63 | "bool", 64 | "xs", 65 | "-", 66 | "-", 67 | "YBCGE", 68 | "standout not erased by overwriting (hp)", 69 | 3, 70 | ).freeze, 71 | "xenl" => Boolean.new( 72 | "eat_newline_glitch", 73 | "xenl", 74 | "bool", 75 | "xn", 76 | "-", 77 | "-", 78 | "YBCGE", 79 | "newline ignored after 80 cols (concept)", 80 | 4, 81 | ).freeze, 82 | "eo" => Boolean.new( 83 | "erase_overstrike", 84 | "eo", 85 | "bool", 86 | "eo", 87 | "-", 88 | "-", 89 | "YBCG-", 90 | "can erase overstrikes with a blank", 91 | 5, 92 | ).freeze, 93 | "gn" => Boolean.new( 94 | "generic_type", 95 | "gn", 96 | "bool", 97 | "gn", 98 | "-", 99 | "-", 100 | "YB-G-", 101 | "generic line type", 102 | 6, 103 | ).freeze, 104 | "hc" => Boolean.new( 105 | "hard_copy", 106 | "hc", 107 | "bool", 108 | "hc", 109 | "-", 110 | "-", 111 | "YBCG-", 112 | "hardcopy terminal", 113 | 7, 114 | ).freeze, 115 | "km" => Boolean.new( 116 | "has_meta_key", 117 | "km", 118 | "bool", 119 | "km", 120 | "-", 121 | "-", 122 | "YB-GE", 123 | "Has a meta key (i.e., sets 8th-bit)", 124 | 8, 125 | ).freeze, 126 | "hs" => Boolean.new( 127 | "has_status_line", 128 | "hs", 129 | "bool", 130 | "hs", 131 | "-", 132 | "-", 133 | "YB-G-", 134 | "has extra status line", 135 | 9, 136 | ).freeze, 137 | "in" => Boolean.new( 138 | "insert_null_glitch", 139 | "in", 140 | "bool", 141 | "in", 142 | "-", 143 | "-", 144 | "YBCGE", 145 | "insert mode distinguishes nulls", 146 | 10, 147 | ).freeze, 148 | "da" => Boolean.new( 149 | "memory_above", 150 | "da", 151 | "bool", 152 | "da", 153 | "-", 154 | "-", 155 | "YBCG-", 156 | "display may be retained above the screen", 157 | 11, 158 | ).freeze, 159 | "db" => Boolean.new( 160 | "memory_below", 161 | "db", 162 | "bool", 163 | "db", 164 | "-", 165 | "-", 166 | "YB-GE", 167 | "display may be retained below the screen", 168 | 12, 169 | ).freeze, 170 | "mir" => Boolean.new( 171 | "move_insert_mode", 172 | "mir", 173 | "bool", 174 | "mi", 175 | "-", 176 | "-", 177 | "YBCGE", 178 | "safe to move while in insert mode", 179 | 13, 180 | ).freeze, 181 | "msgr" => Boolean.new( 182 | "move_standout_mode", 183 | "msgr", 184 | "bool", 185 | "ms", 186 | "-", 187 | "-", 188 | "YBCGE", 189 | "safe to move while in standout mode", 190 | 14, 191 | ).freeze, 192 | "os" => Boolean.new( 193 | "over_strike", 194 | "os", 195 | "bool", 196 | "os", 197 | "-", 198 | "-", 199 | "YBCG-", 200 | "terminal can overstrike", 201 | 15, 202 | ).freeze, 203 | "eslok" => Boolean.new( 204 | "status_line_esc_ok", 205 | "eslok", 206 | "bool", 207 | "es", 208 | "-", 209 | "-", 210 | "YB-G-", 211 | "escape can be used on the status line", 212 | 16, 213 | ).freeze, 214 | "xt" => Boolean.new( 215 | "dest_tabs_magic_smso", 216 | "xt", 217 | "bool", 218 | "xt", 219 | "-", 220 | "-", 221 | "YBCGE", 222 | "tabs destructive, magic so char (t1061)", 223 | 17, 224 | ).freeze, 225 | "hz" => Boolean.new( 226 | "tilde_glitch", 227 | "hz", 228 | "bool", 229 | "hz", 230 | "-", 231 | "-", 232 | "YB-GE", 233 | "cannot print ~'s (Hazeltine)", 234 | 18, 235 | ).freeze, 236 | "ul" => Boolean.new( 237 | "transparent_underline", 238 | "ul", 239 | "bool", 240 | "ul", 241 | "-", 242 | "-", 243 | "YBCGE", 244 | "underline character overstrikes", 245 | 19, 246 | ).freeze, 247 | "xon" => Boolean.new( 248 | "xon_xoff", 249 | "xon", 250 | "bool", 251 | "xo", 252 | "-", 253 | "-", 254 | "YB---", 255 | "terminal uses xon/xoff handshaking", 256 | 20, 257 | ).freeze, 258 | "nxon" => Boolean.new( 259 | "needs_xon_xoff", 260 | "nxon", 261 | "bool", 262 | "nx", 263 | "-", 264 | "-", 265 | "-----", 266 | "padding will not work, xon/xoff required", 267 | 21, 268 | ).freeze, 269 | "mc5i" => Boolean.new( 270 | "prtr_silent", 271 | "mc5i", 272 | "bool", 273 | "5i", 274 | "-", 275 | "-", 276 | "-----", 277 | "printer will not echo on screen", 278 | 22, 279 | ).freeze, 280 | "chts" => Boolean.new( 281 | "hard_cursor", 282 | "chts", 283 | "bool", 284 | "HC", 285 | "-", 286 | "-", 287 | "-----", 288 | "cursor is hard to see", 289 | 23, 290 | ).freeze, 291 | "nrrmc" => Boolean.new( 292 | "non_rev_rmcup", 293 | "nrrmc", 294 | "bool", 295 | "NR", 296 | "-", 297 | "-", 298 | "-----", 299 | "smcup does not reverse rmcup", 300 | 24, 301 | ).freeze, 302 | "npc" => Boolean.new( 303 | "no_pad_char", 304 | "npc", 305 | "bool", 306 | "NP", 307 | "-", 308 | "-", 309 | "-----", 310 | "pad character does not exist", 311 | 25, 312 | ).freeze, 313 | "ndscr" => Boolean.new( 314 | "non_dest_scroll_region", 315 | "ndscr", 316 | "bool", 317 | "ND", 318 | "-", 319 | "-", 320 | "-----", 321 | "scrolling region is non-destructive", 322 | 26, 323 | ).freeze, 324 | "ccc" => Boolean.new( 325 | "can_change", 326 | "ccc", 327 | "bool", 328 | "cc", 329 | "-", 330 | "-", 331 | "-----", 332 | "terminal can re-define existing colors", 333 | 27, 334 | ).freeze, 335 | "bce" => Boolean.new( 336 | "back_color_erase", 337 | "bce", 338 | "bool", 339 | "ut", 340 | "-", 341 | "-", 342 | "-----", 343 | "screen erased with background color", 344 | 28, 345 | ).freeze, 346 | "hls" => Boolean.new( 347 | "hue_lightness_saturation", 348 | "hls", 349 | "bool", 350 | "hl", 351 | "-", 352 | "-", 353 | "-----", 354 | "terminal uses only HLS color notation (Tektronix)", 355 | 29, 356 | ).freeze, 357 | "xhpa" => Boolean.new( 358 | "col_addr_glitch", 359 | "xhpa", 360 | "bool", 361 | "YA", 362 | "-", 363 | "-", 364 | "-----", 365 | "only positive motion for hpa/mhpa caps", 366 | 30, 367 | ).freeze, 368 | "crxm" => Boolean.new( 369 | "cr_cancels_micro_mode", 370 | "crxm", 371 | "bool", 372 | "YB", 373 | "-", 374 | "-", 375 | "-----", 376 | "using cr turns off micro mode", 377 | 31, 378 | ).freeze, 379 | "daisy" => Boolean.new( 380 | "has_print_wheel", 381 | "daisy", 382 | "bool", 383 | "YC", 384 | "-", 385 | "-", 386 | "-----", 387 | "printer needs operator to change character set", 388 | 32, 389 | ).freeze, 390 | "xvpa" => Boolean.new( 391 | "row_addr_glitch", 392 | "xvpa", 393 | "bool", 394 | "YD", 395 | "-", 396 | "-", 397 | "-----", 398 | "only positive motion for vpa/mvpa caps", 399 | 33, 400 | ).freeze, 401 | "sam" => Boolean.new( 402 | "semi_auto_right_margin", 403 | "sam", 404 | "bool", 405 | "YE", 406 | "-", 407 | "-", 408 | "-----", 409 | "printing in last column causes cr", 410 | 34, 411 | ).freeze, 412 | "cpix" => Boolean.new( 413 | "cpi_changes_res", 414 | "cpix", 415 | "bool", 416 | "YF", 417 | "-", 418 | "-", 419 | "-----", 420 | "changing character pitch changes resolution", 421 | 35, 422 | ).freeze, 423 | "lpix" => Boolean.new( 424 | "lpi_changes_res", 425 | "lpix", 426 | "bool", 427 | "YG", 428 | "-", 429 | "-", 430 | "-----", 431 | "changing line pitch changes resolution", 432 | 36, 433 | ).freeze, 434 | }.freeze 435 | BOOLEAN_LIST = BOOLEANS.values 436 | 437 | NUMBERS = { 438 | "cols" => Number.new( 439 | "columns", 440 | "cols", 441 | "num", 442 | "co", 443 | "-", 444 | "-", 445 | "YBCGE", 446 | "number of columns in a line", 447 | 0, 448 | ).freeze, 449 | "it" => Number.new( 450 | "init_tabs", 451 | "it", 452 | "num", 453 | "it", 454 | "-", 455 | "-", 456 | "YB-G-", 457 | "tabs initially every # spaces", 458 | 1, 459 | ).freeze, 460 | "lines" => Number.new( 461 | "lines", 462 | "lines", 463 | "num", 464 | "li", 465 | "-", 466 | "-", 467 | "YBCGE", 468 | "number of lines on screen or page", 469 | 2, 470 | ).freeze, 471 | "lm" => Number.new( 472 | "lines_of_memory", 473 | "lm", 474 | "num", 475 | "lm", 476 | "-", 477 | "-", 478 | "YB-G-", 479 | "lines of memory if > line. 0 means varies", 480 | 3, 481 | ).freeze, 482 | "xmc" => Number.new( 483 | "magic_cookie_glitch", 484 | "xmc", 485 | "num", 486 | "sg", 487 | "-", 488 | "-", 489 | "YBCGE", 490 | "number of blank characters left by smso or rmso", 491 | 4, 492 | ).freeze, 493 | "pb" => Number.new( 494 | "padding_baud_rate", 495 | "pb", 496 | "num", 497 | "pb", 498 | "-", 499 | "-", 500 | "YB-GE", 501 | "lowest baud rate where padding needed", 502 | 5, 503 | ).freeze, 504 | "vt" => Number.new( 505 | "virtual_terminal", 506 | "vt", 507 | "num", 508 | "vt", 509 | "-", 510 | "-", 511 | "YB---", 512 | "virtual terminal number (CB/unix)", 513 | 6, 514 | ).freeze, 515 | "wsl" => Number.new( 516 | "width_status_line", 517 | "wsl", 518 | "num", 519 | "ws", 520 | "-", 521 | "-", 522 | "YB-G-", 523 | "number of columns in status line", 524 | 7, 525 | ).freeze, 526 | "nlab" => Number.new( 527 | "num_labels", 528 | "nlab", 529 | "num", 530 | "Nl", 531 | "-", 532 | "-", 533 | "-----", 534 | "number of labels on screen", 535 | 8, 536 | ).freeze, 537 | "lh" => Number.new( 538 | "label_height", 539 | "lh", 540 | "num", 541 | "lh", 542 | "-", 543 | "-", 544 | "-----", 545 | "rows in each label", 546 | 9, 547 | ).freeze, 548 | "lw" => Number.new( 549 | "label_width", 550 | "lw", 551 | "num", 552 | "lw", 553 | "-", 554 | "-", 555 | "-----", 556 | "columns in each label", 557 | 10, 558 | ).freeze, 559 | "ma" => Number.new( 560 | "max_attributes", 561 | "ma", 562 | "num", 563 | "ma", 564 | "-", 565 | "-", 566 | "YBC--", 567 | "maximum combined attributes terminal can handle", 568 | 11, 569 | ).freeze, 570 | "wnum" => Number.new( 571 | "maximum_windows", 572 | "wnum", 573 | "num", 574 | "MW", 575 | "-", 576 | "-", 577 | "-----", 578 | "maximum number of definable windows", 579 | 12, 580 | ).freeze, 581 | "colors" => Number.new( 582 | "max_colors", 583 | "colors", 584 | "num", 585 | "Co", 586 | "-", 587 | "-", 588 | "-----", 589 | "maximum number of colors on screen", 590 | 13, 591 | ).freeze, 592 | "pairs" => Number.new( 593 | "max_pairs", 594 | "pairs", 595 | "num", 596 | "pa", 597 | "-", 598 | "-", 599 | "-----", 600 | "maximum number of color-pairs on the screen", 601 | 14, 602 | ).freeze, 603 | "ncv" => Number.new( 604 | "no_color_video", 605 | "ncv", 606 | "num", 607 | "NC", 608 | "-", 609 | "-", 610 | "-----", 611 | "video attributes that cannot be used with colors", 612 | 15, 613 | ).freeze, 614 | "bufsz" => Number.new( 615 | "buffer_capacity", 616 | "bufsz", 617 | "num", 618 | "Ya", 619 | "-", 620 | "-", 621 | "-----", 622 | "numbers of bytes buffered before printing", 623 | 16, 624 | ).freeze, 625 | "spinv" => Number.new( 626 | "dot_vert_spacing", 627 | "spinv", 628 | "num", 629 | "Yb", 630 | "-", 631 | "-", 632 | "-----", 633 | "spacing of pins vertically in pins per inch", 634 | 17, 635 | ).freeze, 636 | "spinh" => Number.new( 637 | "dot_horz_spacing", 638 | "spinh", 639 | "num", 640 | "Yc", 641 | "-", 642 | "-", 643 | "-----", 644 | "spacing of dots horizontally in dots per inch", 645 | 18, 646 | ).freeze, 647 | "maddr" => Number.new( 648 | "max_micro_address", 649 | "maddr", 650 | "num", 651 | "Yd", 652 | "-", 653 | "-", 654 | "-----", 655 | "maximum value in micro_..._address", 656 | 19, 657 | ).freeze, 658 | "mjump" => Number.new( 659 | "max_micro_jump", 660 | "mjump", 661 | "num", 662 | "Ye", 663 | "-", 664 | "-", 665 | "-----", 666 | "maximum value in parm_..._micro", 667 | 20, 668 | ).freeze, 669 | "mcs" => Number.new( 670 | "micro_col_size", 671 | "mcs", 672 | "num", 673 | "Yf", 674 | "-", 675 | "-", 676 | "-----", 677 | "character step size when in micro mode", 678 | 21, 679 | ).freeze, 680 | "mls" => Number.new( 681 | "micro_line_size", 682 | "mls", 683 | "num", 684 | "Yg", 685 | "-", 686 | "-", 687 | "-----", 688 | "line step size when in micro mode", 689 | 22, 690 | ).freeze, 691 | "npins" => Number.new( 692 | "number_of_pins", 693 | "npins", 694 | "num", 695 | "Yh", 696 | "-", 697 | "-", 698 | "-----", 699 | "numbers of pins in print-head", 700 | 23, 701 | ).freeze, 702 | "orc" => Number.new( 703 | "output_res_char", 704 | "orc", 705 | "num", 706 | "Yi", 707 | "-", 708 | "-", 709 | "-----", 710 | "horizontal resolution in units per line", 711 | 24, 712 | ).freeze, 713 | "orl" => Number.new( 714 | "output_res_line", 715 | "orl", 716 | "num", 717 | "Yj", 718 | "-", 719 | "-", 720 | "-----", 721 | "vertical resolution in units per line", 722 | 25, 723 | ).freeze, 724 | "orhi" => Number.new( 725 | "output_res_horz_inch", 726 | "orhi", 727 | "num", 728 | "Yk", 729 | "-", 730 | "-", 731 | "-----", 732 | "horizontal resolution in units per inch", 733 | 26, 734 | ).freeze, 735 | "orvi" => Number.new( 736 | "output_res_vert_inch", 737 | "orvi", 738 | "num", 739 | "Yl", 740 | "-", 741 | "-", 742 | "-----", 743 | "vertical resolution in units per inch", 744 | 27, 745 | ).freeze, 746 | "cps" => Number.new( 747 | "print_rate", 748 | "cps", 749 | "num", 750 | "Ym", 751 | "-", 752 | "-", 753 | "-----", 754 | "print rate in characters per second", 755 | 28, 756 | ).freeze, 757 | "widcs" => Number.new( 758 | "wide_char_size", 759 | "widcs", 760 | "num", 761 | "Yn", 762 | "-", 763 | "-", 764 | "-----", 765 | "character step size when in double wide mode", 766 | 29, 767 | ).freeze, 768 | "btns" => Number.new( 769 | "buttons", 770 | "btns", 771 | "num", 772 | "BT", 773 | "-", 774 | "-", 775 | "-----", 776 | "number of buttons on mouse", 777 | 30, 778 | ).freeze, 779 | "bitwin" => Number.new( 780 | "bit_image_entwining", 781 | "bitwin", 782 | "num", 783 | "Yo", 784 | "-", 785 | "-", 786 | "-----", 787 | "number of passes for each bit-image row", 788 | 31, 789 | ).freeze, 790 | "bitype" => Number.new( 791 | "bit_image_type", 792 | "bitype", 793 | "num", 794 | "Yp", 795 | "-", 796 | "-", 797 | "-----", 798 | "type of bit-image device", 799 | 32, 800 | ).freeze, 801 | }.freeze 802 | NUMBER_LIST = NUMBERS.values 803 | 804 | STRINGS = { 805 | "cbt" => String.new( 806 | "back_tab", 807 | "cbt", 808 | "str", 809 | "bt", 810 | "-", 811 | "-", 812 | "YBCGE", 813 | "back tab (P)", 814 | 0, 815 | ).freeze, 816 | "bel" => String.new( 817 | "bell", 818 | "bel", 819 | "str", 820 | "bl", 821 | "-", 822 | "-", 823 | "YB-GE", 824 | "audible signal (bell) (P)", 825 | 1, 826 | ).freeze, 827 | "cr" => String.new( 828 | "carriage_return", 829 | "cr", 830 | "str", 831 | "cr", 832 | "-", 833 | "-", 834 | "YBCGE", 835 | "carriage return (P*) (P*)", 836 | 2, 837 | ).freeze, 838 | "csr" => String.new( 839 | "change_scroll_region", 840 | "csr", 841 | "str", 842 | "cs", 843 | "-", 844 | "-", 845 | "YBCGE", 846 | "change region to line #1 to line #2 (P)", 847 | 3, 848 | ).freeze, 849 | "tbc" => String.new( 850 | "clear_all_tabs", 851 | "tbc", 852 | "str", 853 | "ct", 854 | "-", 855 | "-", 856 | "YB-G-", 857 | "clear all tab stops (P)", 858 | 4, 859 | ).freeze, 860 | "clear" => String.new( 861 | "clear_screen", 862 | "clear", 863 | "str", 864 | "cl", 865 | "-", 866 | "-", 867 | "YBCGE", 868 | "clear screen and home cursor (P*)", 869 | 5, 870 | ).freeze, 871 | "el" => String.new( 872 | "clr_eol", 873 | "el", 874 | "str", 875 | "ce", 876 | "-", 877 | "-", 878 | "YBCGE", 879 | "clear to end of line (P)", 880 | 6, 881 | ).freeze, 882 | "ed" => String.new( 883 | "clr_eos", 884 | "ed", 885 | "str", 886 | "cd", 887 | "-", 888 | "-", 889 | "YBCGE", 890 | "clear to end of screen (P*)", 891 | 7, 892 | ).freeze, 893 | "hpa" => String.new( 894 | "column_address", 895 | "hpa", 896 | "str", 897 | "ch", 898 | "-", 899 | "-", 900 | "-B-GE*", 901 | "horizontal position #1, absolute (P)", 902 | 8, 903 | ).freeze, 904 | "cmdch" => String.new( 905 | "command_character", 906 | "cmdch", 907 | "str", 908 | "CC", 909 | "-", 910 | "-", 911 | "YB-G-", 912 | "terminal settable cmd character in prototype !?", 913 | 9, 914 | ).freeze, 915 | "cup" => String.new( 916 | "cursor_address", 917 | "cup", 918 | "str", 919 | "cm", 920 | "-", 921 | "-", 922 | "YBCGE", 923 | "move to row #1 columns #2", 924 | 10, 925 | ).freeze, 926 | "cud1" => String.new( 927 | "cursor_down", 928 | "cud1", 929 | "str", 930 | "do", 931 | "-", 932 | "-", 933 | "YBCGE", 934 | "down one line", 935 | 11, 936 | ).freeze, 937 | "home" => String.new( 938 | "cursor_home", 939 | "home", 940 | "str", 941 | "ho", 942 | "-", 943 | "-", 944 | "YBCGE", 945 | "home cursor (if no cup)", 946 | 12, 947 | ).freeze, 948 | "civis" => String.new( 949 | "cursor_invisible", 950 | "civis", 951 | "str", 952 | "vi", 953 | "-", 954 | "-", 955 | "YB-G-", 956 | "make cursor invisible", 957 | 13, 958 | ).freeze, 959 | "cub1" => String.new( 960 | "cursor_left", 961 | "cub1", 962 | "str", 963 | "le", 964 | "-", 965 | "-", 966 | "YBCGE", 967 | "move left one space", 968 | 14, 969 | ).freeze, 970 | "mrcup" => String.new( 971 | "cursor_mem_address", 972 | "mrcup", 973 | "str", 974 | "CM", 975 | "-", 976 | "-", 977 | "YB-G-", 978 | "memory relative cursor addressing, move to row #1 columns #2", 979 | 15, 980 | ).freeze, 981 | "cnorm" => String.new( 982 | "cursor_normal", 983 | "cnorm", 984 | "str", 985 | "ve", 986 | "-", 987 | "-", 988 | "YBCGE", 989 | "make cursor appear normal (undo civis/cvvis)", 990 | 16, 991 | ).freeze, 992 | "cuf1" => String.new( 993 | "cursor_right", 994 | "cuf1", 995 | "str", 996 | "nd", 997 | "-", 998 | "-", 999 | "YBCGE", 1000 | "non-destructive space (move right one space)", 1001 | 17, 1002 | ).freeze, 1003 | "ll" => String.new( 1004 | "cursor_to_ll", 1005 | "ll", 1006 | "str", 1007 | "ll", 1008 | "-", 1009 | "-", 1010 | "YBCGE", 1011 | "last line, first column (if no cup)", 1012 | 18, 1013 | ).freeze, 1014 | "cuu1" => String.new( 1015 | "cursor_up", 1016 | "cuu1", 1017 | "str", 1018 | "up", 1019 | "-", 1020 | "-", 1021 | "YBCGE", 1022 | "up one line", 1023 | 19, 1024 | ).freeze, 1025 | "cvvis" => String.new( 1026 | "cursor_visible", 1027 | "cvvis", 1028 | "str", 1029 | "vs", 1030 | "-", 1031 | "-", 1032 | "YBCGE", 1033 | "make cursor very visible", 1034 | 20, 1035 | ).freeze, 1036 | "dch1" => String.new( 1037 | "delete_character", 1038 | "dch1", 1039 | "str", 1040 | "dc", 1041 | "-", 1042 | "-", 1043 | "YBCGE", 1044 | "delete character (P*)", 1045 | 21, 1046 | ).freeze, 1047 | "dl1" => String.new( 1048 | "delete_line", 1049 | "dl1", 1050 | "str", 1051 | "dl", 1052 | "-", 1053 | "-", 1054 | "YBCGE", 1055 | "delete line (P*)", 1056 | 22, 1057 | ).freeze, 1058 | "dsl" => String.new( 1059 | "dis_status_line", 1060 | "dsl", 1061 | "str", 1062 | "ds", 1063 | "-", 1064 | "-", 1065 | "YB-G-", 1066 | "disable status line", 1067 | 23, 1068 | ).freeze, 1069 | "hd" => String.new( 1070 | "down_half_line", 1071 | "hd", 1072 | "str", 1073 | "hd", 1074 | "-", 1075 | "-", 1076 | "YB-G-", 1077 | "half a line down", 1078 | 24, 1079 | ).freeze, 1080 | "smacs" => String.new( 1081 | "enter_alt_charset_mode", 1082 | "smacs", 1083 | "str", 1084 | "as", 1085 | "-", 1086 | "-", 1087 | "YB-G-", 1088 | "start alternate character set (P)", 1089 | 25, 1090 | ).freeze, 1091 | "blink" => String.new( 1092 | "enter_blink_mode", 1093 | "blink", 1094 | "str", 1095 | "mb", 1096 | "-", 1097 | "-", 1098 | "YB-G-", 1099 | "turn on blinking", 1100 | 26, 1101 | ).freeze, 1102 | "bold" => String.new( 1103 | "enter_bold_mode", 1104 | "bold", 1105 | "str", 1106 | "md", 1107 | "-", 1108 | "-", 1109 | "YB-G-", 1110 | "turn on bold (extra bright) mode", 1111 | 27, 1112 | ).freeze, 1113 | "smcup" => String.new( 1114 | "enter_ca_mode", 1115 | "smcup", 1116 | "str", 1117 | "ti", 1118 | "-", 1119 | "-", 1120 | "YBCGE", 1121 | "string to start programs using cup", 1122 | 28, 1123 | ).freeze, 1124 | "smdc" => String.new( 1125 | "enter_delete_mode", 1126 | "smdc", 1127 | "str", 1128 | "dm", 1129 | "-", 1130 | "-", 1131 | "YBCGE", 1132 | "enter delete mode", 1133 | 29, 1134 | ).freeze, 1135 | "dim" => String.new( 1136 | "enter_dim_mode", 1137 | "dim", 1138 | "str", 1139 | "mh", 1140 | "-", 1141 | "-", 1142 | "YB-G-", 1143 | "turn on half-bright mode", 1144 | 30, 1145 | ).freeze, 1146 | "smir" => String.new( 1147 | "enter_insert_mode", 1148 | "smir", 1149 | "str", 1150 | "im", 1151 | "-", 1152 | "-", 1153 | "YBCGE", 1154 | "enter insert mode", 1155 | 31, 1156 | ).freeze, 1157 | "invis" => String.new( 1158 | "enter_secure_mode", 1159 | "invis", 1160 | "str", 1161 | "mk", 1162 | "-", 1163 | "-", 1164 | "-B-G-*", 1165 | "turn on blank mode (characters invisible)", 1166 | 32, 1167 | ).freeze, 1168 | "prot" => String.new( 1169 | "enter_protected_mode", 1170 | "prot", 1171 | "str", 1172 | "mp", 1173 | "-", 1174 | "-", 1175 | "-B-G-*", 1176 | "turn on protected mode", 1177 | 33, 1178 | ).freeze, 1179 | "rev" => String.new( 1180 | "enter_reverse_mode", 1181 | "rev", 1182 | "str", 1183 | "mr", 1184 | "-", 1185 | "-", 1186 | "YB-G-", 1187 | "turn on reverse video mode", 1188 | 34, 1189 | ).freeze, 1190 | "smso" => String.new( 1191 | "enter_standout_mode", 1192 | "smso", 1193 | "str", 1194 | "so", 1195 | "-", 1196 | "-", 1197 | "YBCGE", 1198 | "begin standout mode", 1199 | 35, 1200 | ).freeze, 1201 | "smul" => String.new( 1202 | "enter_underline_mode", 1203 | "smul", 1204 | "str", 1205 | "us", 1206 | "-", 1207 | "-", 1208 | "YBCGE", 1209 | "begin underline mode", 1210 | 36, 1211 | ).freeze, 1212 | "ech" => String.new( 1213 | "erase_chars", 1214 | "ech", 1215 | "str", 1216 | "ec", 1217 | "-", 1218 | "-", 1219 | "YB-G-", 1220 | "erase #1 characters (P)", 1221 | 37, 1222 | ).freeze, 1223 | "rmacs" => String.new( 1224 | "exit_alt_charset_mode", 1225 | "rmacs", 1226 | "str", 1227 | "ae", 1228 | "-", 1229 | "-", 1230 | "YB-G-", 1231 | "end alternate character set (P)", 1232 | 38, 1233 | ).freeze, 1234 | "sgr0" => String.new( 1235 | "exit_attribute_mode", 1236 | "sgr0", 1237 | "str", 1238 | "me", 1239 | "-", 1240 | "-", 1241 | "YB-GE", 1242 | "turn off all attributes", 1243 | 39, 1244 | ).freeze, 1245 | "rmcup" => String.new( 1246 | "exit_ca_mode", 1247 | "rmcup", 1248 | "str", 1249 | "te", 1250 | "-", 1251 | "-", 1252 | "YBCGE", 1253 | "strings to end programs using cup", 1254 | 40, 1255 | ).freeze, 1256 | "rmdc" => String.new( 1257 | "exit_delete_mode", 1258 | "rmdc", 1259 | "str", 1260 | "ed", 1261 | "-", 1262 | "-", 1263 | "YBCGE", 1264 | "end delete mode", 1265 | 41, 1266 | ).freeze, 1267 | "rmir" => String.new( 1268 | "exit_insert_mode", 1269 | "rmir", 1270 | "str", 1271 | "ei", 1272 | "-", 1273 | "-", 1274 | "YBCGE", 1275 | "exit insert mode", 1276 | 42, 1277 | ).freeze, 1278 | "rmso" => String.new( 1279 | "exit_standout_mode", 1280 | "rmso", 1281 | "str", 1282 | "se", 1283 | "-", 1284 | "-", 1285 | "YBCGE", 1286 | "exit standout mode", 1287 | 43, 1288 | ).freeze, 1289 | "rmul" => String.new( 1290 | "exit_underline_mode", 1291 | "rmul", 1292 | "str", 1293 | "ue", 1294 | "-", 1295 | "-", 1296 | "YBCGE", 1297 | "exit underline mode", 1298 | 44, 1299 | ).freeze, 1300 | "flash" => String.new( 1301 | "flash_screen", 1302 | "flash", 1303 | "str", 1304 | "vb", 1305 | "-", 1306 | "-", 1307 | "YBCGE", 1308 | "visible bell (may not move cursor)", 1309 | 45, 1310 | ).freeze, 1311 | "ff" => String.new( 1312 | "form_feed", 1313 | "ff", 1314 | "str", 1315 | "ff", 1316 | "-", 1317 | "-", 1318 | "YB-G-", 1319 | "hardcopy terminal page eject (P*)", 1320 | 46, 1321 | ).freeze, 1322 | "fsl" => String.new( 1323 | "from_status_line", 1324 | "fsl", 1325 | "str", 1326 | "fs", 1327 | "-", 1328 | "-", 1329 | "YB-G-", 1330 | "return from status line", 1331 | 47, 1332 | ).freeze, 1333 | "is1" => String.new( 1334 | "init_1string", 1335 | "is1", 1336 | "str", 1337 | "i1", 1338 | "-", 1339 | "-", 1340 | "YB-G-", 1341 | "initialization string", 1342 | 48, 1343 | ).freeze, 1344 | "is2" => String.new( 1345 | "init_2string", 1346 | "is2", 1347 | "str", 1348 | "is", 1349 | "-", 1350 | "-", 1351 | "YB-G-", 1352 | "initialization string", 1353 | 49, 1354 | ).freeze, 1355 | "is3" => String.new( 1356 | "init_3string", 1357 | "is3", 1358 | "str", 1359 | "i3", 1360 | "-", 1361 | "-", 1362 | "YB-G-", 1363 | "initialization string", 1364 | 50, 1365 | ).freeze, 1366 | "if" => String.new( 1367 | "init_file", 1368 | "if", 1369 | "str", 1370 | "if", 1371 | "-", 1372 | "-", 1373 | "YB-G-", 1374 | "name of initialization file", 1375 | 51, 1376 | ).freeze, 1377 | "ich1" => String.new( 1378 | "insert_character", 1379 | "ich1", 1380 | "str", 1381 | "ic", 1382 | "-", 1383 | "-", 1384 | "YBCGE", 1385 | "insert character (P)", 1386 | 52, 1387 | ).freeze, 1388 | "il1" => String.new( 1389 | "insert_line", 1390 | "il1", 1391 | "str", 1392 | "al", 1393 | "-", 1394 | "-", 1395 | "YBCGE", 1396 | "insert line (P*)", 1397 | 53, 1398 | ).freeze, 1399 | "ip" => String.new( 1400 | "insert_padding", 1401 | "ip", 1402 | "str", 1403 | "ip", 1404 | "-", 1405 | "-", 1406 | "YBCGE", 1407 | "insert padding after inserted character", 1408 | 54, 1409 | ).freeze, 1410 | "kbs" => String.new( 1411 | "key_backspace", 1412 | "kbs", 1413 | "str", 1414 | "kb", 1415 | "KEY_BACKSPACE", 1416 | "0407", 1417 | "YB-G-", 1418 | "backspace key", 1419 | 55, 1420 | ).freeze, 1421 | "ktbc" => String.new( 1422 | "key_catab", 1423 | "ktbc", 1424 | "str", 1425 | "ka", 1426 | "KEY_CATAB", 1427 | "0526", 1428 | "-B-G-*", 1429 | "clear-all-tabs key", 1430 | 56, 1431 | ).freeze, 1432 | "kclr" => String.new( 1433 | "key_clear", 1434 | "kclr", 1435 | "str", 1436 | "kC", 1437 | "KEY_CLEAR", 1438 | "0515", 1439 | "-B-G-*", 1440 | "clear-screen or erase key", 1441 | 57, 1442 | ).freeze, 1443 | "kctab" => String.new( 1444 | "key_ctab", 1445 | "kctab", 1446 | "str", 1447 | "kt", 1448 | "KEY_CTAB", 1449 | "0525", 1450 | "-B-G-*", 1451 | "clear-tab key", 1452 | 58, 1453 | ).freeze, 1454 | "kdch1" => String.new( 1455 | "key_dc", 1456 | "kdch1", 1457 | "str", 1458 | "kD", 1459 | "KEY_DC", 1460 | "0512", 1461 | "YB-G-", 1462 | "delete-character key", 1463 | 59, 1464 | ).freeze, 1465 | "kdl1" => String.new( 1466 | "key_dl", 1467 | "kdl1", 1468 | "str", 1469 | "kL", 1470 | "KEY_DL", 1471 | "0510", 1472 | "-B-G-*", 1473 | "delete-line key", 1474 | 60, 1475 | ).freeze, 1476 | "kcud1" => String.new( 1477 | "key_down", 1478 | "kcud1", 1479 | "str", 1480 | "kd", 1481 | "KEY_DOWN", 1482 | "0402", 1483 | "YBCGE", 1484 | "down-arrow key", 1485 | 61, 1486 | ).freeze, 1487 | "krmir" => String.new( 1488 | "key_eic", 1489 | "krmir", 1490 | "str", 1491 | "kM", 1492 | "KEY_EIC", 1493 | "0514", 1494 | "-B-G-*", 1495 | "sent by rmir or smir in insert mode", 1496 | 62, 1497 | ).freeze, 1498 | "kel" => String.new( 1499 | "key_eol", 1500 | "kel", 1501 | "str", 1502 | "kE", 1503 | "KEY_EOL", 1504 | "0517", 1505 | "-B-G-*", 1506 | "clear-to-end-of-line key", 1507 | 63, 1508 | ).freeze, 1509 | "ked" => String.new( 1510 | "key_eos", 1511 | "ked", 1512 | "str", 1513 | "kS", 1514 | "KEY_EOS", 1515 | "0516", 1516 | "-B-G-*", 1517 | "clear-to-end-of-screen key", 1518 | 64, 1519 | ).freeze, 1520 | "kf0" => String.new( 1521 | "key_f0", 1522 | "kf0", 1523 | "str", 1524 | "k0", 1525 | "KEY_F(0)", 1526 | "0410", 1527 | "YBCGE", 1528 | "F0 function key", 1529 | 65, 1530 | ).freeze, 1531 | "kf1" => String.new( 1532 | "key_f1", 1533 | "kf1", 1534 | "str", 1535 | "k1", 1536 | "KEY_F(1)", 1537 | "-", 1538 | "YBCGE", 1539 | "F1 function key", 1540 | 66, 1541 | ).freeze, 1542 | "kf10" => String.new( 1543 | "key_f10", 1544 | "kf10", 1545 | "str", 1546 | "k;", 1547 | "KEY_F(10)", 1548 | "-", 1549 | "----E", 1550 | "F10 function key", 1551 | 67, 1552 | ).freeze, 1553 | "kf2" => String.new( 1554 | "key_f2", 1555 | "kf2", 1556 | "str", 1557 | "k2", 1558 | "KEY_F(2)", 1559 | "-", 1560 | "YBCGE", 1561 | "F2 function key", 1562 | 68, 1563 | ).freeze, 1564 | "kf3" => String.new( 1565 | "key_f3", 1566 | "kf3", 1567 | "str", 1568 | "k3", 1569 | "KEY_F(3)", 1570 | "-", 1571 | "YBCGE", 1572 | "F3 function key", 1573 | 69, 1574 | ).freeze, 1575 | "kf4" => String.new( 1576 | "key_f4", 1577 | "kf4", 1578 | "str", 1579 | "k4", 1580 | "KEY_F(4)", 1581 | "-", 1582 | "YBCGE", 1583 | "F4 function key", 1584 | 70, 1585 | ).freeze, 1586 | "kf5" => String.new( 1587 | "key_f5", 1588 | "kf5", 1589 | "str", 1590 | "k5", 1591 | "KEY_F(5)", 1592 | "-", 1593 | "YBCGE", 1594 | "F5 function key", 1595 | 71, 1596 | ).freeze, 1597 | "kf6" => String.new( 1598 | "key_f6", 1599 | "kf6", 1600 | "str", 1601 | "k6", 1602 | "KEY_F(6)", 1603 | "-", 1604 | "YBCGE", 1605 | "F6 function key", 1606 | 72, 1607 | ).freeze, 1608 | "kf7" => String.new( 1609 | "key_f7", 1610 | "kf7", 1611 | "str", 1612 | "k7", 1613 | "KEY_F(7)", 1614 | "-", 1615 | "YBCGE", 1616 | "F7 function key", 1617 | 73, 1618 | ).freeze, 1619 | "kf8" => String.new( 1620 | "key_f8", 1621 | "kf8", 1622 | "str", 1623 | "k8", 1624 | "KEY_F(8)", 1625 | "-", 1626 | "YBCGE", 1627 | "F8 function key", 1628 | 74, 1629 | ).freeze, 1630 | "kf9" => String.new( 1631 | "key_f9", 1632 | "kf9", 1633 | "str", 1634 | "k9", 1635 | "KEY_F(9)", 1636 | "-", 1637 | "YBCGE", 1638 | "F9 function key", 1639 | 75, 1640 | ).freeze, 1641 | "khome" => String.new( 1642 | "key_home", 1643 | "khome", 1644 | "str", 1645 | "kh", 1646 | "KEY_HOME", 1647 | "0406", 1648 | "YBCGE", 1649 | "home key", 1650 | 76, 1651 | ).freeze, 1652 | "kich1" => String.new( 1653 | "key_ic", 1654 | "kich1", 1655 | "str", 1656 | "kI", 1657 | "KEY_IC", 1658 | "0513", 1659 | "YB-GE", 1660 | "insert-character key", 1661 | 77, 1662 | ).freeze, 1663 | "kil1" => String.new( 1664 | "key_il", 1665 | "kil1", 1666 | "str", 1667 | "kA", 1668 | "KEY_IL", 1669 | "0511", 1670 | "-B-G-*", 1671 | "insert-line key", 1672 | 78, 1673 | ).freeze, 1674 | "kcub1" => String.new( 1675 | "key_left", 1676 | "kcub1", 1677 | "str", 1678 | "kl", 1679 | "KEY_LEFT", 1680 | "0404", 1681 | "YBCGE", 1682 | "left-arrow key", 1683 | 79, 1684 | ).freeze, 1685 | "kll" => String.new( 1686 | "key_ll", 1687 | "kll", 1688 | "str", 1689 | "kH", 1690 | "KEY_LL", 1691 | "0533", 1692 | "YB-G-", 1693 | "lower-left key (home down)", 1694 | 80, 1695 | ).freeze, 1696 | "knp" => String.new( 1697 | "key_npage", 1698 | "knp", 1699 | "str", 1700 | "kN", 1701 | "KEY_NPAGE", 1702 | "0522", 1703 | "YB-GE", 1704 | "next-page key", 1705 | 81, 1706 | ).freeze, 1707 | "kpp" => String.new( 1708 | "key_ppage", 1709 | "kpp", 1710 | "str", 1711 | "kP", 1712 | "KEY_PPAGE", 1713 | "0523", 1714 | "YB-GE", 1715 | "previous-page key", 1716 | 82, 1717 | ).freeze, 1718 | "kcuf1" => String.new( 1719 | "key_right", 1720 | "kcuf1", 1721 | "str", 1722 | "kr", 1723 | "KEY_RIGHT", 1724 | "0405", 1725 | "YBCGE", 1726 | "right-arrow key", 1727 | 83, 1728 | ).freeze, 1729 | "kind" => String.new( 1730 | "key_sf", 1731 | "kind", 1732 | "str", 1733 | "kF", 1734 | "KEY_SF", 1735 | "0520", 1736 | "-B-G-*", 1737 | "scroll-forward key", 1738 | 84, 1739 | ).freeze, 1740 | "kri" => String.new( 1741 | "key_sr", 1742 | "kri", 1743 | "str", 1744 | "kR", 1745 | "KEY_SR", 1746 | "0521", 1747 | "-B-G-*", 1748 | "scroll-backward key", 1749 | 85, 1750 | ).freeze, 1751 | "khts" => String.new( 1752 | "key_stab", 1753 | "khts", 1754 | "str", 1755 | "kT", 1756 | "KEY_STAB", 1757 | "0524", 1758 | "-B-G-*", 1759 | "set-tab key", 1760 | 86, 1761 | ).freeze, 1762 | "kcuu1" => String.new( 1763 | "key_up", 1764 | "kcuu1", 1765 | "str", 1766 | "ku", 1767 | "KEY_UP", 1768 | "0403", 1769 | "YBCGE", 1770 | "up-arrow key", 1771 | 87, 1772 | ).freeze, 1773 | "rmkx" => String.new( 1774 | "keypad_local", 1775 | "rmkx", 1776 | "str", 1777 | "ke", 1778 | "-", 1779 | "-", 1780 | "YBCGE", 1781 | "leave keyboard transmit mode", 1782 | 88, 1783 | ).freeze, 1784 | "smkx" => String.new( 1785 | "keypad_xmit", 1786 | "smkx", 1787 | "str", 1788 | "ks", 1789 | "-", 1790 | "-", 1791 | "YBCGE", 1792 | "enter keyboard transmit mode", 1793 | 89, 1794 | ).freeze, 1795 | "lf0" => String.new( 1796 | "lab_f0", 1797 | "lf0", 1798 | "str", 1799 | "l0", 1800 | "-", 1801 | "-", 1802 | "-B-G-*", 1803 | "label on function key f0 if not f0", 1804 | 90, 1805 | ).freeze, 1806 | "lf1" => String.new( 1807 | "lab_f1", 1808 | "lf1", 1809 | "str", 1810 | "l1", 1811 | "-", 1812 | "-", 1813 | "-B-G-*", 1814 | "label on function key f1 if not f1", 1815 | 91, 1816 | ).freeze, 1817 | "lf10" => String.new( 1818 | "lab_f10", 1819 | "lf10", 1820 | "str", 1821 | "la", 1822 | "-", 1823 | "-", 1824 | "-----", 1825 | "label on function key f10 if not f10", 1826 | 92, 1827 | ).freeze, 1828 | "lf2" => String.new( 1829 | "lab_f2", 1830 | "lf2", 1831 | "str", 1832 | "l2", 1833 | "-", 1834 | "-", 1835 | "-B-G-*", 1836 | "label on function key f2 if not f2", 1837 | 93, 1838 | ).freeze, 1839 | "lf3" => String.new( 1840 | "lab_f3", 1841 | "lf3", 1842 | "str", 1843 | "l3", 1844 | "-", 1845 | "-", 1846 | "-B-G-*", 1847 | "label on function key f3 if not f3", 1848 | 94, 1849 | ).freeze, 1850 | "lf4" => String.new( 1851 | "lab_f4", 1852 | "lf4", 1853 | "str", 1854 | "l4", 1855 | "-", 1856 | "-", 1857 | "-B-G-*", 1858 | "label on function key f4 if not f4", 1859 | 95, 1860 | ).freeze, 1861 | "lf5" => String.new( 1862 | "lab_f5", 1863 | "lf5", 1864 | "str", 1865 | "l5", 1866 | "-", 1867 | "-", 1868 | "-B-G-*", 1869 | "label on function key f5 if not f5", 1870 | 96, 1871 | ).freeze, 1872 | "lf6" => String.new( 1873 | "lab_f6", 1874 | "lf6", 1875 | "str", 1876 | "l6", 1877 | "-", 1878 | "-", 1879 | "-B-G-*", 1880 | "label on function key f6 if not f6", 1881 | 97, 1882 | ).freeze, 1883 | "lf7" => String.new( 1884 | "lab_f7", 1885 | "lf7", 1886 | "str", 1887 | "l7", 1888 | "-", 1889 | "-", 1890 | "-B-G-*", 1891 | "label on function key f7 if not f7", 1892 | 98, 1893 | ).freeze, 1894 | "lf8" => String.new( 1895 | "lab_f8", 1896 | "lf8", 1897 | "str", 1898 | "l8", 1899 | "-", 1900 | "-", 1901 | "-B-G-*", 1902 | "label on function key f8 if not f8", 1903 | 99, 1904 | ).freeze, 1905 | "lf9" => String.new( 1906 | "lab_f9", 1907 | "lf9", 1908 | "str", 1909 | "l9", 1910 | "-", 1911 | "-", 1912 | "-B-G-*", 1913 | "label on function key f9 if not f9", 1914 | 100, 1915 | ).freeze, 1916 | "rmm" => String.new( 1917 | "meta_off", 1918 | "rmm", 1919 | "str", 1920 | "mo", 1921 | "-", 1922 | "-", 1923 | "YB-G-*", 1924 | "turn off meta mode", 1925 | 101, 1926 | ).freeze, 1927 | "smm" => String.new( 1928 | "meta_on", 1929 | "smm", 1930 | "str", 1931 | "mm", 1932 | "-", 1933 | "-", 1934 | "YB-G-*", 1935 | "turn on meta mode (8th-bit on)", 1936 | 102, 1937 | ).freeze, 1938 | "nel" => String.new( 1939 | "newline", 1940 | "nel", 1941 | "str", 1942 | "nw", 1943 | "-", 1944 | "-", 1945 | "YB-G-*", 1946 | "newline (behave like cr followed by lf)", 1947 | 103, 1948 | ).freeze, 1949 | "pad" => String.new( 1950 | "pad_char", 1951 | "pad", 1952 | "str", 1953 | "pc", 1954 | "-", 1955 | "-", 1956 | "YBCGE", 1957 | "padding char (instead of null)", 1958 | 104, 1959 | ).freeze, 1960 | "dch" => String.new( 1961 | "parm_dch", 1962 | "dch", 1963 | "str", 1964 | "DC", 1965 | "-", 1966 | "-", 1967 | "YB-GE", 1968 | "delete #1 characters (P*)", 1969 | 105, 1970 | ).freeze, 1971 | "dl" => String.new( 1972 | "parm_delete_line", 1973 | "dl", 1974 | "str", 1975 | "DL", 1976 | "-", 1977 | "-", 1978 | "YBCGE", 1979 | "delete #1 lines (P*)", 1980 | 106, 1981 | ).freeze, 1982 | "cud" => String.new( 1983 | "parm_down_cursor", 1984 | "cud", 1985 | "str", 1986 | "DO", 1987 | "-", 1988 | "-", 1989 | "YBCGE", 1990 | "down #1 lines (P*)", 1991 | 107, 1992 | ).freeze, 1993 | "ich" => String.new( 1994 | "parm_ich", 1995 | "ich", 1996 | "str", 1997 | "IC", 1998 | "-", 1999 | "-", 2000 | "YB-GE", 2001 | "insert #1 characters (P*)", 2002 | 108, 2003 | ).freeze, 2004 | "indn" => String.new( 2005 | "parm_index", 2006 | "indn", 2007 | "str", 2008 | "SF", 2009 | "-", 2010 | "-", 2011 | "YBCG-", 2012 | "scroll forward #1 lines (P)", 2013 | 109, 2014 | ).freeze, 2015 | "il" => String.new( 2016 | "parm_insert_line", 2017 | "il", 2018 | "str", 2019 | "AL", 2020 | "-", 2021 | "-", 2022 | "YBCGE", 2023 | "insert #1 lines (P*)", 2024 | 110, 2025 | ).freeze, 2026 | "cub" => String.new( 2027 | "parm_left_cursor", 2028 | "cub", 2029 | "str", 2030 | "LE", 2031 | "-", 2032 | "-", 2033 | "YBCGE", 2034 | "move #1 characters to the left (P)", 2035 | 111, 2036 | ).freeze, 2037 | "cuf" => String.new( 2038 | "parm_right_cursor", 2039 | "cuf", 2040 | "str", 2041 | "RI", 2042 | "-", 2043 | "-", 2044 | "YBCGE", 2045 | "move #1 characters to the right (P*)", 2046 | 112, 2047 | ).freeze, 2048 | "rin" => String.new( 2049 | "parm_rindex", 2050 | "rin", 2051 | "str", 2052 | "SR", 2053 | "-", 2054 | "-", 2055 | "YBCG-", 2056 | "scroll back #1 lines (P)", 2057 | 113, 2058 | ).freeze, 2059 | "cuu" => String.new( 2060 | "parm_up_cursor", 2061 | "cuu", 2062 | "str", 2063 | "UP", 2064 | "-", 2065 | "-", 2066 | "YBCGE", 2067 | "up #1 lines (P*)", 2068 | 114, 2069 | ).freeze, 2070 | "pfkey" => String.new( 2071 | "pkey_key", 2072 | "pfkey", 2073 | "str", 2074 | "pk", 2075 | "-", 2076 | "-", 2077 | "-B---", 2078 | "program function key #1 to type string #2", 2079 | 115, 2080 | ).freeze, 2081 | "pfloc" => String.new( 2082 | "pkey_local", 2083 | "pfloc", 2084 | "str", 2085 | "pl", 2086 | "-", 2087 | "-", 2088 | "-B---", 2089 | "program function key #1 to execute string #2", 2090 | 116, 2091 | ).freeze, 2092 | "pfx" => String.new( 2093 | "pkey_xmit", 2094 | "pfx", 2095 | "str", 2096 | "px", 2097 | "-", 2098 | "-", 2099 | "-B---", 2100 | "program function key #1 to transmit string #2", 2101 | 117, 2102 | ).freeze, 2103 | "mc0" => String.new( 2104 | "print_screen", 2105 | "mc0", 2106 | "str", 2107 | "ps", 2108 | "-", 2109 | "-", 2110 | "-B-G-*", 2111 | "print contents of screen", 2112 | 118, 2113 | ).freeze, 2114 | "mc4" => String.new( 2115 | "prtr_off", 2116 | "mc4", 2117 | "str", 2118 | "pf", 2119 | "-", 2120 | "-", 2121 | "-B-G-*", 2122 | "turn off printer", 2123 | 119, 2124 | ).freeze, 2125 | "mc5" => String.new( 2126 | "prtr_on", 2127 | "mc5", 2128 | "str", 2129 | "po", 2130 | "-", 2131 | "-", 2132 | "-B-G-*", 2133 | "turn on printer", 2134 | 120, 2135 | ).freeze, 2136 | "rep" => String.new( 2137 | "repeat_char", 2138 | "rep", 2139 | "str", 2140 | "rp", 2141 | "-", 2142 | "-", 2143 | "YB-GE", 2144 | "repeat char #1 #2 times (P*)", 2145 | 121, 2146 | ).freeze, 2147 | "rs1" => String.new( 2148 | "reset_1string", 2149 | "rs1", 2150 | "str", 2151 | "r1", 2152 | "-", 2153 | "-", 2154 | "-B---", 2155 | "reset string", 2156 | 122, 2157 | ).freeze, 2158 | "rs2" => String.new( 2159 | "reset_2string", 2160 | "rs2", 2161 | "str", 2162 | "r2", 2163 | "-", 2164 | "-", 2165 | "-B---", 2166 | "reset string", 2167 | 123, 2168 | ).freeze, 2169 | "rs3" => String.new( 2170 | "reset_3string", 2171 | "rs3", 2172 | "str", 2173 | "r3", 2174 | "-", 2175 | "-", 2176 | "-B---", 2177 | "reset string", 2178 | 124, 2179 | ).freeze, 2180 | "rf" => String.new( 2181 | "reset_file", 2182 | "rf", 2183 | "str", 2184 | "rf", 2185 | "-", 2186 | "-", 2187 | "-B---", 2188 | "name of reset file", 2189 | 125, 2190 | ).freeze, 2191 | "rc" => String.new( 2192 | "restore_cursor", 2193 | "rc", 2194 | "str", 2195 | "rc", 2196 | "-", 2197 | "-", 2198 | "YBCG-", 2199 | "restore cursor to position of last save_cursor", 2200 | 126, 2201 | ).freeze, 2202 | "vpa" => String.new( 2203 | "row_address", 2204 | "vpa", 2205 | "str", 2206 | "cv", 2207 | "-", 2208 | "-", 2209 | "-B-GE*", 2210 | "vertical position #1 absolute (P)", 2211 | 127, 2212 | ).freeze, 2213 | "sc" => String.new( 2214 | "save_cursor", 2215 | "sc", 2216 | "str", 2217 | "sc", 2218 | "-", 2219 | "-", 2220 | "YBCG-", 2221 | "save current cursor position (P)", 2222 | 128, 2223 | ).freeze, 2224 | "ind" => String.new( 2225 | "scroll_forward", 2226 | "ind", 2227 | "str", 2228 | "sf", 2229 | "-", 2230 | "-", 2231 | "YBCGE", 2232 | "scroll text up (P)", 2233 | 129, 2234 | ).freeze, 2235 | "ri" => String.new( 2236 | "scroll_reverse", 2237 | "ri", 2238 | "str", 2239 | "sr", 2240 | "-", 2241 | "-", 2242 | "YBCGE", 2243 | "scroll text down (P)", 2244 | 130, 2245 | ).freeze, 2246 | "sgr" => String.new( 2247 | "set_attributes", 2248 | "sgr", 2249 | "str", 2250 | "sa", 2251 | "-", 2252 | "-", 2253 | "YB-G-", 2254 | "define video attributes #1-#9 (PG9)", 2255 | 131, 2256 | ).freeze, 2257 | "hts" => String.new( 2258 | "set_tab", 2259 | "hts", 2260 | "str", 2261 | "st", 2262 | "-", 2263 | "-", 2264 | "YB-G-", 2265 | "set a tab in every row, current columns", 2266 | 132, 2267 | ).freeze, 2268 | "wind" => String.new( 2269 | "set_window", 2270 | "wind", 2271 | "str", 2272 | "wi", 2273 | "-", 2274 | "-", 2275 | "-B-GE", 2276 | "current window is lines #1-#2 cols #3-#4", 2277 | 133, 2278 | ).freeze, 2279 | "ht" => String.new( 2280 | "tab", 2281 | "ht", 2282 | "str", 2283 | "ta", 2284 | "-", 2285 | "-", 2286 | "YBCGE", 2287 | "tab to next 8-space hardware tab stop", 2288 | 134, 2289 | ).freeze, 2290 | "tsl" => String.new( 2291 | "to_status_line", 2292 | "tsl", 2293 | "str", 2294 | "ts", 2295 | "-", 2296 | "-", 2297 | "YB-G-", 2298 | "move to status line, column #1", 2299 | 135, 2300 | ).freeze, 2301 | "uc" => String.new( 2302 | "underline_char", 2303 | "uc", 2304 | "str", 2305 | "uc", 2306 | "-", 2307 | "-", 2308 | "YBCG-", 2309 | "underline char and move past it", 2310 | 136, 2311 | ).freeze, 2312 | "hu" => String.new( 2313 | "up_half_line", 2314 | "hu", 2315 | "str", 2316 | "hu", 2317 | "-", 2318 | "-", 2319 | "YB-G-", 2320 | "half a line up", 2321 | 137, 2322 | ).freeze, 2323 | "iprog" => String.new( 2324 | "init_prog", 2325 | "iprog", 2326 | "str", 2327 | "iP", 2328 | "-", 2329 | "-", 2330 | "-B---", 2331 | "path name of program for initialization", 2332 | 138, 2333 | ).freeze, 2334 | "ka1" => String.new( 2335 | "key_a1", 2336 | "ka1", 2337 | "str", 2338 | "K1", 2339 | "KEY_A1", 2340 | "0534", 2341 | "YB-GE", 2342 | "upper left of keypad", 2343 | 139, 2344 | ).freeze, 2345 | "ka3" => String.new( 2346 | "key_a3", 2347 | "ka3", 2348 | "str", 2349 | "K3", 2350 | "KEY_A3", 2351 | "0535", 2352 | "YB-GE", 2353 | "upper right of keypad", 2354 | 140, 2355 | ).freeze, 2356 | "kb2" => String.new( 2357 | "key_b2", 2358 | "kb2", 2359 | "str", 2360 | "K2", 2361 | "KEY_B2", 2362 | "0536", 2363 | "YB-GE", 2364 | "center of keypad", 2365 | 141, 2366 | ).freeze, 2367 | "kc1" => String.new( 2368 | "key_c1", 2369 | "kc1", 2370 | "str", 2371 | "K4", 2372 | "KEY_C1", 2373 | "0537", 2374 | "YB-GE", 2375 | "lower left of keypad", 2376 | 142, 2377 | ).freeze, 2378 | "kc3" => String.new( 2379 | "key_c3", 2380 | "kc3", 2381 | "str", 2382 | "K5", 2383 | "KEY_C3", 2384 | "0540", 2385 | "YB-GE", 2386 | "lower right of keypad", 2387 | 143, 2388 | ).freeze, 2389 | "mc5p" => String.new( 2390 | "prtr_non", 2391 | "mc5p", 2392 | "str", 2393 | "pO", 2394 | "-", 2395 | "-", 2396 | "-B-G-*", 2397 | "turn on printer for #1 bytes", 2398 | 144, 2399 | ).freeze, 2400 | "rmp" => String.new( 2401 | "char_padding", 2402 | "rmp", 2403 | "str", 2404 | "rP", 2405 | "-", 2406 | "-", 2407 | "-----", 2408 | "like ip but when in insert mode", 2409 | 145, 2410 | ).freeze, 2411 | "acsc" => String.new( 2412 | "acs_chars", 2413 | "acsc", 2414 | "str", 2415 | "ac", 2416 | "-", 2417 | "-", 2418 | "-----", 2419 | "graphics charset pairs, based on vt100", 2420 | 146, 2421 | ).freeze, 2422 | "pln" => String.new( 2423 | "plab_norm", 2424 | "pln", 2425 | "str", 2426 | "pn", 2427 | "-", 2428 | "-", 2429 | "-----", 2430 | "program label #1 to show string #2", 2431 | 147, 2432 | ).freeze, 2433 | "kcbt" => String.new( 2434 | "key_btab", 2435 | "kcbt", 2436 | "str", 2437 | "kB", 2438 | "KEY_BTAB", 2439 | "0541", 2440 | "-----", 2441 | "back-tab key", 2442 | 148, 2443 | ).freeze, 2444 | "smxon" => String.new( 2445 | "enter_xon_mode", 2446 | "smxon", 2447 | "str", 2448 | "SX", 2449 | "-", 2450 | "-", 2451 | "-----", 2452 | "turn on xon/xoff handshaking", 2453 | 149, 2454 | ).freeze, 2455 | "rmxon" => String.new( 2456 | "exit_xon_mode", 2457 | "rmxon", 2458 | "str", 2459 | "RX", 2460 | "-", 2461 | "-", 2462 | "-----", 2463 | "turn off xon/xoff handshaking", 2464 | 150, 2465 | ).freeze, 2466 | "smam" => String.new( 2467 | "enter_am_mode", 2468 | "smam", 2469 | "str", 2470 | "SA", 2471 | "-", 2472 | "-", 2473 | "-----", 2474 | "turn on automatic margins", 2475 | 151, 2476 | ).freeze, 2477 | "rmam" => String.new( 2478 | "exit_am_mode", 2479 | "rmam", 2480 | "str", 2481 | "RA", 2482 | "-", 2483 | "-", 2484 | "-----", 2485 | "turn off automatic margins", 2486 | 152, 2487 | ).freeze, 2488 | "xonc" => String.new( 2489 | "xon_character", 2490 | "xonc", 2491 | "str", 2492 | "XN", 2493 | "-", 2494 | "-", 2495 | "-----", 2496 | "XON character", 2497 | 153, 2498 | ).freeze, 2499 | "xoffc" => String.new( 2500 | "xoff_character", 2501 | "xoffc", 2502 | "str", 2503 | "XF", 2504 | "-", 2505 | "-", 2506 | "-----", 2507 | "XOFF character", 2508 | 154, 2509 | ).freeze, 2510 | "enacs" => String.new( 2511 | "ena_acs", 2512 | "enacs", 2513 | "str", 2514 | "eA", 2515 | "-", 2516 | "-", 2517 | "-----", 2518 | "enable alternate char set", 2519 | 155, 2520 | ).freeze, 2521 | "smln" => String.new( 2522 | "label_on", 2523 | "smln", 2524 | "str", 2525 | "LO", 2526 | "-", 2527 | "-", 2528 | "-----", 2529 | "turn on soft labels", 2530 | 156, 2531 | ).freeze, 2532 | "rmln" => String.new( 2533 | "label_off", 2534 | "rmln", 2535 | "str", 2536 | "LF", 2537 | "-", 2538 | "-", 2539 | "-----", 2540 | "turn off soft labels", 2541 | 157, 2542 | ).freeze, 2543 | "kbeg" => String.new( 2544 | "key_beg", 2545 | "kbeg", 2546 | "str", 2547 | "@1", 2548 | "KEY_BEG", 2549 | "0542", 2550 | "-----", 2551 | "begin key", 2552 | 158, 2553 | ).freeze, 2554 | "kcan" => String.new( 2555 | "key_cancel", 2556 | "kcan", 2557 | "str", 2558 | "@2", 2559 | "KEY_CANCEL", 2560 | "0543", 2561 | "-----", 2562 | "cancel key", 2563 | 159, 2564 | ).freeze, 2565 | "kclo" => String.new( 2566 | "key_close", 2567 | "kclo", 2568 | "str", 2569 | "@3", 2570 | "KEY_CLOSE", 2571 | "0544", 2572 | "-----", 2573 | "close key", 2574 | 160, 2575 | ).freeze, 2576 | "kcmd" => String.new( 2577 | "key_command", 2578 | "kcmd", 2579 | "str", 2580 | "@4", 2581 | "KEY_COMMAND", 2582 | "0545", 2583 | "-----", 2584 | "command key", 2585 | 161, 2586 | ).freeze, 2587 | "kcpy" => String.new( 2588 | "key_copy", 2589 | "kcpy", 2590 | "str", 2591 | "@5", 2592 | "KEY_COPY", 2593 | "0546", 2594 | "-----", 2595 | "copy key", 2596 | 162, 2597 | ).freeze, 2598 | "kcrt" => String.new( 2599 | "key_create", 2600 | "kcrt", 2601 | "str", 2602 | "@6", 2603 | "KEY_CREATE", 2604 | "0547", 2605 | "-----", 2606 | "create key", 2607 | 163, 2608 | ).freeze, 2609 | "kend" => String.new( 2610 | "key_end", 2611 | "kend", 2612 | "str", 2613 | "@7", 2614 | "KEY_END", 2615 | "0550", 2616 | "-----", 2617 | "end key", 2618 | 164, 2619 | ).freeze, 2620 | "kent" => String.new( 2621 | "key_enter", 2622 | "kent", 2623 | "str", 2624 | "@8", 2625 | "KEY_ENTER", 2626 | "0527", 2627 | "-----", 2628 | "enter/send key", 2629 | 165, 2630 | ).freeze, 2631 | "kext" => String.new( 2632 | "key_exit", 2633 | "kext", 2634 | "str", 2635 | "@9", 2636 | "KEY_EXIT", 2637 | "0551", 2638 | "-----", 2639 | "exit key", 2640 | 166, 2641 | ).freeze, 2642 | "kfnd" => String.new( 2643 | "key_find", 2644 | "kfnd", 2645 | "str", 2646 | "@0", 2647 | "KEY_FIND", 2648 | "0552", 2649 | "-----", 2650 | "find key", 2651 | 167, 2652 | ).freeze, 2653 | "khlp" => String.new( 2654 | "key_help", 2655 | "khlp", 2656 | "str", 2657 | "%1", 2658 | "KEY_HELP", 2659 | "0553", 2660 | "-----", 2661 | "help key", 2662 | 168, 2663 | ).freeze, 2664 | "kmrk" => String.new( 2665 | "key_mark", 2666 | "kmrk", 2667 | "str", 2668 | "%2", 2669 | "KEY_MARK", 2670 | "0554", 2671 | "-----", 2672 | "mark key", 2673 | 169, 2674 | ).freeze, 2675 | "kmsg" => String.new( 2676 | "key_message", 2677 | "kmsg", 2678 | "str", 2679 | "%3", 2680 | "KEY_MESSAGE", 2681 | "0555", 2682 | "-----", 2683 | "message key", 2684 | 170, 2685 | ).freeze, 2686 | "kmov" => String.new( 2687 | "key_move", 2688 | "kmov", 2689 | "str", 2690 | "%4", 2691 | "KEY_MOVE", 2692 | "0556", 2693 | "-----", 2694 | "move key", 2695 | 171, 2696 | ).freeze, 2697 | "knxt" => String.new( 2698 | "key_next", 2699 | "knxt", 2700 | "str", 2701 | "%5", 2702 | "KEY_NEXT", 2703 | "0557", 2704 | "-----", 2705 | "next key", 2706 | 172, 2707 | ).freeze, 2708 | "kopn" => String.new( 2709 | "key_open", 2710 | "kopn", 2711 | "str", 2712 | "%6", 2713 | "KEY_OPEN", 2714 | "0560", 2715 | "-----", 2716 | "open key", 2717 | 173, 2718 | ).freeze, 2719 | "kopt" => String.new( 2720 | "key_options", 2721 | "kopt", 2722 | "str", 2723 | "%7", 2724 | "KEY_OPTIONS", 2725 | "0561", 2726 | "-----", 2727 | "options key", 2728 | 174, 2729 | ).freeze, 2730 | "kprv" => String.new( 2731 | "key_previous", 2732 | "kprv", 2733 | "str", 2734 | "%8", 2735 | "KEY_PREVIOUS", 2736 | "0562", 2737 | "-----", 2738 | "previous key", 2739 | 175, 2740 | ).freeze, 2741 | "kprt" => String.new( 2742 | "key_print", 2743 | "kprt", 2744 | "str", 2745 | "%9", 2746 | "KEY_PRINT", 2747 | "0532", 2748 | "-----", 2749 | "print key", 2750 | 176, 2751 | ).freeze, 2752 | "krdo" => String.new( 2753 | "key_redo", 2754 | "krdo", 2755 | "str", 2756 | "%0", 2757 | "KEY_REDO", 2758 | "0563", 2759 | "-----", 2760 | "redo key", 2761 | 177, 2762 | ).freeze, 2763 | "kref" => String.new( 2764 | "key_reference", 2765 | "kref", 2766 | "str", 2767 | "&1", 2768 | "KEY_REFERENCE", 2769 | "0564", 2770 | "-----", 2771 | "reference key", 2772 | 178, 2773 | ).freeze, 2774 | "krfr" => String.new( 2775 | "key_refresh", 2776 | "krfr", 2777 | "str", 2778 | "&2", 2779 | "KEY_REFRESH", 2780 | "0565", 2781 | "-----", 2782 | "refresh key", 2783 | 179, 2784 | ).freeze, 2785 | "krpl" => String.new( 2786 | "key_replace", 2787 | "krpl", 2788 | "str", 2789 | "&3", 2790 | "KEY_REPLACE", 2791 | "0566", 2792 | "-----", 2793 | "replace key", 2794 | 180, 2795 | ).freeze, 2796 | "krst" => String.new( 2797 | "key_restart", 2798 | "krst", 2799 | "str", 2800 | "&4", 2801 | "KEY_RESTART", 2802 | "0567", 2803 | "-----", 2804 | "restart key", 2805 | 181, 2806 | ).freeze, 2807 | "kres" => String.new( 2808 | "key_resume", 2809 | "kres", 2810 | "str", 2811 | "&5", 2812 | "KEY_RESUME", 2813 | "0570", 2814 | "-----", 2815 | "resume key", 2816 | 182, 2817 | ).freeze, 2818 | "ksav" => String.new( 2819 | "key_save", 2820 | "ksav", 2821 | "str", 2822 | "&6", 2823 | "KEY_SAVE", 2824 | "0571", 2825 | "-----", 2826 | "save key", 2827 | 183, 2828 | ).freeze, 2829 | "kspd" => String.new( 2830 | "key_suspend", 2831 | "kspd", 2832 | "str", 2833 | "&7", 2834 | "KEY_SUSPEND", 2835 | "0627", 2836 | "-----", 2837 | "suspend key", 2838 | 184, 2839 | ).freeze, 2840 | "kund" => String.new( 2841 | "key_undo", 2842 | "kund", 2843 | "str", 2844 | "&8", 2845 | "KEY_UNDO", 2846 | "0630", 2847 | "-----", 2848 | "undo key", 2849 | 185, 2850 | ).freeze, 2851 | "kBEG" => String.new( 2852 | "key_sbeg", 2853 | "kBEG", 2854 | "str", 2855 | "&9", 2856 | "KEY_SBEG", 2857 | "0572", 2858 | "-----", 2859 | "shifted begin key", 2860 | 186, 2861 | ).freeze, 2862 | "kCAN" => String.new( 2863 | "key_scancel", 2864 | "kCAN", 2865 | "str", 2866 | "&0", 2867 | "KEY_SCANCEL", 2868 | "0573", 2869 | "-----", 2870 | "shifted cancel key", 2871 | 187, 2872 | ).freeze, 2873 | "kCMD" => String.new( 2874 | "key_scommand", 2875 | "kCMD", 2876 | "str", 2877 | "*1", 2878 | "KEY_SCOMMAND", 2879 | "0574", 2880 | "-----", 2881 | "shifted command key", 2882 | 188, 2883 | ).freeze, 2884 | "kCPY" => String.new( 2885 | "key_scopy", 2886 | "kCPY", 2887 | "str", 2888 | "*2", 2889 | "KEY_SCOPY", 2890 | "0575", 2891 | "-----", 2892 | "shifted copy key", 2893 | 189, 2894 | ).freeze, 2895 | "kCRT" => String.new( 2896 | "key_screate", 2897 | "kCRT", 2898 | "str", 2899 | "*3", 2900 | "KEY_SCREATE", 2901 | "0576", 2902 | "-----", 2903 | "shifted create key", 2904 | 190, 2905 | ).freeze, 2906 | "kDC" => String.new( 2907 | "key_sdc", 2908 | "kDC", 2909 | "str", 2910 | "*4", 2911 | "KEY_SDC", 2912 | "0577", 2913 | "-----", 2914 | "shifted delete-character key", 2915 | 191, 2916 | ).freeze, 2917 | "kDL" => String.new( 2918 | "key_sdl", 2919 | "kDL", 2920 | "str", 2921 | "*5", 2922 | "KEY_SDL", 2923 | "0600", 2924 | "-----", 2925 | "shifted delete-line key", 2926 | 192, 2927 | ).freeze, 2928 | "kslt" => String.new( 2929 | "key_select", 2930 | "kslt", 2931 | "str", 2932 | "*6", 2933 | "KEY_SELECT", 2934 | "0601", 2935 | "-----", 2936 | "select key", 2937 | 193, 2938 | ).freeze, 2939 | "kEND" => String.new( 2940 | "key_send", 2941 | "kEND", 2942 | "str", 2943 | "*7", 2944 | "KEY_SEND", 2945 | "0602", 2946 | "-----", 2947 | "shifted end key", 2948 | 194, 2949 | ).freeze, 2950 | "kEOL" => String.new( 2951 | "key_seol", 2952 | "kEOL", 2953 | "str", 2954 | "*8", 2955 | "KEY_SEOL", 2956 | "0603", 2957 | "-----", 2958 | "shifted clear-to-end-of-line key", 2959 | 195, 2960 | ).freeze, 2961 | "kEXT" => String.new( 2962 | "key_sexit", 2963 | "kEXT", 2964 | "str", 2965 | "*9", 2966 | "KEY_SEXIT", 2967 | "0604", 2968 | "-----", 2969 | "shifted exit key", 2970 | 196, 2971 | ).freeze, 2972 | "kFND" => String.new( 2973 | "key_sfind", 2974 | "kFND", 2975 | "str", 2976 | "*0", 2977 | "KEY_SFIND", 2978 | "0605", 2979 | "-----", 2980 | "shifted find key", 2981 | 197, 2982 | ).freeze, 2983 | "kHLP" => String.new( 2984 | "key_shelp", 2985 | "kHLP", 2986 | "str", 2987 | "#1", 2988 | "KEY_SHELP", 2989 | "0606", 2990 | "-----", 2991 | "shifted help key", 2992 | 198, 2993 | ).freeze, 2994 | "kHOM" => String.new( 2995 | "key_shome", 2996 | "kHOM", 2997 | "str", 2998 | "#2", 2999 | "KEY_SHOME", 3000 | "0607", 3001 | "-----", 3002 | "shifted home key", 3003 | 199, 3004 | ).freeze, 3005 | "kIC" => String.new( 3006 | "key_sic", 3007 | "kIC", 3008 | "str", 3009 | "#3", 3010 | "KEY_SIC", 3011 | "0610", 3012 | "-----", 3013 | "shifted insert-character key", 3014 | 200, 3015 | ).freeze, 3016 | "kLFT" => String.new( 3017 | "key_sleft", 3018 | "kLFT", 3019 | "str", 3020 | "#4", 3021 | "KEY_SLEFT", 3022 | "0611", 3023 | "-----", 3024 | "shifted left-arrow key", 3025 | 201, 3026 | ).freeze, 3027 | "kMSG" => String.new( 3028 | "key_smessage", 3029 | "kMSG", 3030 | "str", 3031 | "%a", 3032 | "KEY_SMESSAGE", 3033 | "0612", 3034 | "-----", 3035 | "shifted message key", 3036 | 202, 3037 | ).freeze, 3038 | "kMOV" => String.new( 3039 | "key_smove", 3040 | "kMOV", 3041 | "str", 3042 | "%b", 3043 | "KEY_SMOVE", 3044 | "0613", 3045 | "-----", 3046 | "shifted move key", 3047 | 203, 3048 | ).freeze, 3049 | "kNXT" => String.new( 3050 | "key_snext", 3051 | "kNXT", 3052 | "str", 3053 | "%c", 3054 | "KEY_SNEXT", 3055 | "0614", 3056 | "-----", 3057 | "shifted next key", 3058 | 204, 3059 | ).freeze, 3060 | "kOPT" => String.new( 3061 | "key_soptions", 3062 | "kOPT", 3063 | "str", 3064 | "%d", 3065 | "KEY_SOPTIONS", 3066 | "0615", 3067 | "-----", 3068 | "shifted options key", 3069 | 205, 3070 | ).freeze, 3071 | "kPRV" => String.new( 3072 | "key_sprevious", 3073 | "kPRV", 3074 | "str", 3075 | "%e", 3076 | "KEY_SPREVIOUS", 3077 | "0616", 3078 | "-----", 3079 | "shifted previous key", 3080 | 206, 3081 | ).freeze, 3082 | "kPRT" => String.new( 3083 | "key_sprint", 3084 | "kPRT", 3085 | "str", 3086 | "%f", 3087 | "KEY_SPRINT", 3088 | "0617", 3089 | "-----", 3090 | "shifted print key", 3091 | 207, 3092 | ).freeze, 3093 | "kRDO" => String.new( 3094 | "key_sredo", 3095 | "kRDO", 3096 | "str", 3097 | "%g", 3098 | "KEY_SREDO", 3099 | "0620", 3100 | "-----", 3101 | "shifted redo key", 3102 | 208, 3103 | ).freeze, 3104 | "kRPL" => String.new( 3105 | "key_sreplace", 3106 | "kRPL", 3107 | "str", 3108 | "%h", 3109 | "KEY_SREPLACE", 3110 | "0621", 3111 | "-----", 3112 | "shifted replace key", 3113 | 209, 3114 | ).freeze, 3115 | "kRIT" => String.new( 3116 | "key_sright", 3117 | "kRIT", 3118 | "str", 3119 | "%i", 3120 | "KEY_SRIGHT", 3121 | "0622", 3122 | "-----", 3123 | "shifted right-arrow key", 3124 | 210, 3125 | ).freeze, 3126 | "kRES" => String.new( 3127 | "key_srsume", 3128 | "kRES", 3129 | "str", 3130 | "%j", 3131 | "KEY_SRSUME", 3132 | "0623", 3133 | "-----", 3134 | "shifted resume key", 3135 | 211, 3136 | ).freeze, 3137 | "kSAV" => String.new( 3138 | "key_ssave", 3139 | "kSAV", 3140 | "str", 3141 | "!1", 3142 | "KEY_SSAVE", 3143 | "0624", 3144 | "-----", 3145 | "shifted save key", 3146 | 212, 3147 | ).freeze, 3148 | "kSPD" => String.new( 3149 | "key_ssuspend", 3150 | "kSPD", 3151 | "str", 3152 | "!2", 3153 | "KEY_SSUSPEND", 3154 | "0625", 3155 | "-----", 3156 | "shifted suspend key", 3157 | 213, 3158 | ).freeze, 3159 | "kUND" => String.new( 3160 | "key_sundo", 3161 | "kUND", 3162 | "str", 3163 | "!3", 3164 | "KEY_SUNDO", 3165 | "0626", 3166 | "-----", 3167 | "shifted undo key", 3168 | 214, 3169 | ).freeze, 3170 | "rfi" => String.new( 3171 | "req_for_input", 3172 | "rfi", 3173 | "str", 3174 | "RF", 3175 | "-", 3176 | "-", 3177 | "-----", 3178 | "send next input char (for ptys)", 3179 | 215, 3180 | ).freeze, 3181 | "kf11" => String.new( 3182 | "key_f11", 3183 | "kf11", 3184 | "str", 3185 | "F1", 3186 | "KEY_F(11)", 3187 | "-", 3188 | "----E", 3189 | "F11 function key", 3190 | 216, 3191 | ).freeze, 3192 | "kf12" => String.new( 3193 | "key_f12", 3194 | "kf12", 3195 | "str", 3196 | "F2", 3197 | "KEY_F(12)", 3198 | "-", 3199 | "----E", 3200 | "F12 function key", 3201 | 217, 3202 | ).freeze, 3203 | "kf13" => String.new( 3204 | "key_f13", 3205 | "kf13", 3206 | "str", 3207 | "F3", 3208 | "KEY_F(13)", 3209 | "-", 3210 | "----E", 3211 | "F13 function key", 3212 | 218, 3213 | ).freeze, 3214 | "kf14" => String.new( 3215 | "key_f14", 3216 | "kf14", 3217 | "str", 3218 | "F4", 3219 | "KEY_F(14)", 3220 | "-", 3221 | "----E", 3222 | "F14 function key", 3223 | 219, 3224 | ).freeze, 3225 | "kf15" => String.new( 3226 | "key_f15", 3227 | "kf15", 3228 | "str", 3229 | "F5", 3230 | "KEY_F(15)", 3231 | "-", 3232 | "----E", 3233 | "F15 function key", 3234 | 220, 3235 | ).freeze, 3236 | "kf16" => String.new( 3237 | "key_f16", 3238 | "kf16", 3239 | "str", 3240 | "F6", 3241 | "KEY_F(16)", 3242 | "-", 3243 | "----E", 3244 | "F16 function key", 3245 | 221, 3246 | ).freeze, 3247 | "kf17" => String.new( 3248 | "key_f17", 3249 | "kf17", 3250 | "str", 3251 | "F7", 3252 | "KEY_F(17)", 3253 | "-", 3254 | "----E", 3255 | "F17 function key", 3256 | 222, 3257 | ).freeze, 3258 | "kf18" => String.new( 3259 | "key_f18", 3260 | "kf18", 3261 | "str", 3262 | "F8", 3263 | "KEY_F(18)", 3264 | "-", 3265 | "----E", 3266 | "F18 function key", 3267 | 223, 3268 | ).freeze, 3269 | "kf19" => String.new( 3270 | "key_f19", 3271 | "kf19", 3272 | "str", 3273 | "F9", 3274 | "KEY_F(19)", 3275 | "-", 3276 | "----E", 3277 | "F19 function key", 3278 | 224, 3279 | ).freeze, 3280 | "kf20" => String.new( 3281 | "key_f20", 3282 | "kf20", 3283 | "str", 3284 | "FA", 3285 | "KEY_F(20)", 3286 | "-", 3287 | "----E", 3288 | "F20 function key", 3289 | 225, 3290 | ).freeze, 3291 | "kf21" => String.new( 3292 | "key_f21", 3293 | "kf21", 3294 | "str", 3295 | "FB", 3296 | "KEY_F(21)", 3297 | "-", 3298 | "----E", 3299 | "F21 function key", 3300 | 226, 3301 | ).freeze, 3302 | "kf22" => String.new( 3303 | "key_f22", 3304 | "kf22", 3305 | "str", 3306 | "FC", 3307 | "KEY_F(22)", 3308 | "-", 3309 | "----E", 3310 | "F22 function key", 3311 | 227, 3312 | ).freeze, 3313 | "kf23" => String.new( 3314 | "key_f23", 3315 | "kf23", 3316 | "str", 3317 | "FD", 3318 | "KEY_F(23)", 3319 | "-", 3320 | "----E", 3321 | "F23 function key", 3322 | 228, 3323 | ).freeze, 3324 | "kf24" => String.new( 3325 | "key_f24", 3326 | "kf24", 3327 | "str", 3328 | "FE", 3329 | "KEY_F(24)", 3330 | "-", 3331 | "----E", 3332 | "F24 function key", 3333 | 229, 3334 | ).freeze, 3335 | "kf25" => String.new( 3336 | "key_f25", 3337 | "kf25", 3338 | "str", 3339 | "FF", 3340 | "KEY_F(25)", 3341 | "-", 3342 | "----E", 3343 | "F25 function key", 3344 | 230, 3345 | ).freeze, 3346 | "kf26" => String.new( 3347 | "key_f26", 3348 | "kf26", 3349 | "str", 3350 | "FG", 3351 | "KEY_F(26)", 3352 | "-", 3353 | "----E", 3354 | "F26 function key", 3355 | 231, 3356 | ).freeze, 3357 | "kf27" => String.new( 3358 | "key_f27", 3359 | "kf27", 3360 | "str", 3361 | "FH", 3362 | "KEY_F(27)", 3363 | "-", 3364 | "----E", 3365 | "F27 function key", 3366 | 232, 3367 | ).freeze, 3368 | "kf28" => String.new( 3369 | "key_f28", 3370 | "kf28", 3371 | "str", 3372 | "FI", 3373 | "KEY_F(28)", 3374 | "-", 3375 | "----E", 3376 | "F28 function key", 3377 | 233, 3378 | ).freeze, 3379 | "kf29" => String.new( 3380 | "key_f29", 3381 | "kf29", 3382 | "str", 3383 | "FJ", 3384 | "KEY_F(29)", 3385 | "-", 3386 | "----E", 3387 | "F29 function key", 3388 | 234, 3389 | ).freeze, 3390 | "kf30" => String.new( 3391 | "key_f30", 3392 | "kf30", 3393 | "str", 3394 | "FK", 3395 | "KEY_F(30)", 3396 | "-", 3397 | "----E", 3398 | "F30 function key", 3399 | 235, 3400 | ).freeze, 3401 | "kf31" => String.new( 3402 | "key_f31", 3403 | "kf31", 3404 | "str", 3405 | "FL", 3406 | "KEY_F(31)", 3407 | "-", 3408 | "----E", 3409 | "F31 function key", 3410 | 236, 3411 | ).freeze, 3412 | "kf32" => String.new( 3413 | "key_f32", 3414 | "kf32", 3415 | "str", 3416 | "FM", 3417 | "KEY_F(32)", 3418 | "-", 3419 | "----E", 3420 | "F32 function key", 3421 | 237, 3422 | ).freeze, 3423 | "kf33" => String.new( 3424 | "key_f33", 3425 | "kf33", 3426 | "str", 3427 | "FN", 3428 | "KEY_F(33)", 3429 | "-", 3430 | "----E", 3431 | "F33 function key", 3432 | 238, 3433 | ).freeze, 3434 | "kf34" => String.new( 3435 | "key_f34", 3436 | "kf34", 3437 | "str", 3438 | "FO", 3439 | "KEY_F(34)", 3440 | "-", 3441 | "----E", 3442 | "F34 function key", 3443 | 239, 3444 | ).freeze, 3445 | "kf35" => String.new( 3446 | "key_f35", 3447 | "kf35", 3448 | "str", 3449 | "FP", 3450 | "KEY_F(35)", 3451 | "-", 3452 | "----E", 3453 | "F35 function key", 3454 | 240, 3455 | ).freeze, 3456 | "kf36" => String.new( 3457 | "key_f36", 3458 | "kf36", 3459 | "str", 3460 | "FQ", 3461 | "KEY_F(36)", 3462 | "-", 3463 | "----E", 3464 | "F36 function key", 3465 | 241, 3466 | ).freeze, 3467 | "kf37" => String.new( 3468 | "key_f37", 3469 | "kf37", 3470 | "str", 3471 | "FR", 3472 | "KEY_F(37)", 3473 | "-", 3474 | "----E", 3475 | "F37 function key", 3476 | 242, 3477 | ).freeze, 3478 | "kf38" => String.new( 3479 | "key_f38", 3480 | "kf38", 3481 | "str", 3482 | "FS", 3483 | "KEY_F(38)", 3484 | "-", 3485 | "----E", 3486 | "F38 function key", 3487 | 243, 3488 | ).freeze, 3489 | "kf39" => String.new( 3490 | "key_f39", 3491 | "kf39", 3492 | "str", 3493 | "FT", 3494 | "KEY_F(39)", 3495 | "-", 3496 | "----E", 3497 | "F39 function key", 3498 | 244, 3499 | ).freeze, 3500 | "kf40" => String.new( 3501 | "key_f40", 3502 | "kf40", 3503 | "str", 3504 | "FU", 3505 | "KEY_F(40)", 3506 | "-", 3507 | "----E", 3508 | "F40 function key", 3509 | 245, 3510 | ).freeze, 3511 | "kf41" => String.new( 3512 | "key_f41", 3513 | "kf41", 3514 | "str", 3515 | "FV", 3516 | "KEY_F(41)", 3517 | "-", 3518 | "----E", 3519 | "F41 function key", 3520 | 246, 3521 | ).freeze, 3522 | "kf42" => String.new( 3523 | "key_f42", 3524 | "kf42", 3525 | "str", 3526 | "FW", 3527 | "KEY_F(42)", 3528 | "-", 3529 | "----E", 3530 | "F42 function key", 3531 | 247, 3532 | ).freeze, 3533 | "kf43" => String.new( 3534 | "key_f43", 3535 | "kf43", 3536 | "str", 3537 | "FX", 3538 | "KEY_F(43)", 3539 | "-", 3540 | "----E", 3541 | "F43 function key", 3542 | 248, 3543 | ).freeze, 3544 | "kf44" => String.new( 3545 | "key_f44", 3546 | "kf44", 3547 | "str", 3548 | "FY", 3549 | "KEY_F(44)", 3550 | "-", 3551 | "----E", 3552 | "F44 function key", 3553 | 249, 3554 | ).freeze, 3555 | "kf45" => String.new( 3556 | "key_f45", 3557 | "kf45", 3558 | "str", 3559 | "FZ", 3560 | "KEY_F(45)", 3561 | "-", 3562 | "----E", 3563 | "F45 function key", 3564 | 250, 3565 | ).freeze, 3566 | "kf46" => String.new( 3567 | "key_f46", 3568 | "kf46", 3569 | "str", 3570 | "Fa", 3571 | "KEY_F(46)", 3572 | "-", 3573 | "----E", 3574 | "F46 function key", 3575 | 251, 3576 | ).freeze, 3577 | "kf47" => String.new( 3578 | "key_f47", 3579 | "kf47", 3580 | "str", 3581 | "Fb", 3582 | "KEY_F(47)", 3583 | "-", 3584 | "----E", 3585 | "F47 function key", 3586 | 252, 3587 | ).freeze, 3588 | "kf48" => String.new( 3589 | "key_f48", 3590 | "kf48", 3591 | "str", 3592 | "Fc", 3593 | "KEY_F(48)", 3594 | "-", 3595 | "----E", 3596 | "F48 function key", 3597 | 253, 3598 | ).freeze, 3599 | "kf49" => String.new( 3600 | "key_f49", 3601 | "kf49", 3602 | "str", 3603 | "Fd", 3604 | "KEY_F(49)", 3605 | "-", 3606 | "----E", 3607 | "F49 function key", 3608 | 254, 3609 | ).freeze, 3610 | "kf50" => String.new( 3611 | "key_f50", 3612 | "kf50", 3613 | "str", 3614 | "Fe", 3615 | "KEY_F(50)", 3616 | "-", 3617 | "----E", 3618 | "F50 function key", 3619 | 255, 3620 | ).freeze, 3621 | "kf51" => String.new( 3622 | "key_f51", 3623 | "kf51", 3624 | "str", 3625 | "Ff", 3626 | "KEY_F(51)", 3627 | "-", 3628 | "----E", 3629 | "F51 function key", 3630 | 256, 3631 | ).freeze, 3632 | "kf52" => String.new( 3633 | "key_f52", 3634 | "kf52", 3635 | "str", 3636 | "Fg", 3637 | "KEY_F(52)", 3638 | "-", 3639 | "----E", 3640 | "F52 function key", 3641 | 257, 3642 | ).freeze, 3643 | "kf53" => String.new( 3644 | "key_f53", 3645 | "kf53", 3646 | "str", 3647 | "Fh", 3648 | "KEY_F(53)", 3649 | "-", 3650 | "----E", 3651 | "F53 function key", 3652 | 258, 3653 | ).freeze, 3654 | "kf54" => String.new( 3655 | "key_f54", 3656 | "kf54", 3657 | "str", 3658 | "Fi", 3659 | "KEY_F(54)", 3660 | "-", 3661 | "----E", 3662 | "F54 function key", 3663 | 259, 3664 | ).freeze, 3665 | "kf55" => String.new( 3666 | "key_f55", 3667 | "kf55", 3668 | "str", 3669 | "Fj", 3670 | "KEY_F(55)", 3671 | "-", 3672 | "----E", 3673 | "F55 function key", 3674 | 260, 3675 | ).freeze, 3676 | "kf56" => String.new( 3677 | "key_f56", 3678 | "kf56", 3679 | "str", 3680 | "Fk", 3681 | "KEY_F(56)", 3682 | "-", 3683 | "----E", 3684 | "F56 function key", 3685 | 261, 3686 | ).freeze, 3687 | "kf57" => String.new( 3688 | "key_f57", 3689 | "kf57", 3690 | "str", 3691 | "Fl", 3692 | "KEY_F(57)", 3693 | "-", 3694 | "----E", 3695 | "F57 function key", 3696 | 262, 3697 | ).freeze, 3698 | "kf58" => String.new( 3699 | "key_f58", 3700 | "kf58", 3701 | "str", 3702 | "Fm", 3703 | "KEY_F(58)", 3704 | "-", 3705 | "----E", 3706 | "F58 function key", 3707 | 263, 3708 | ).freeze, 3709 | "kf59" => String.new( 3710 | "key_f59", 3711 | "kf59", 3712 | "str", 3713 | "Fn", 3714 | "KEY_F(59)", 3715 | "-", 3716 | "----E", 3717 | "F59 function key", 3718 | 264, 3719 | ).freeze, 3720 | "kf60" => String.new( 3721 | "key_f60", 3722 | "kf60", 3723 | "str", 3724 | "Fo", 3725 | "KEY_F(60)", 3726 | "-", 3727 | "----E", 3728 | "F60 function key", 3729 | 265, 3730 | ).freeze, 3731 | "kf61" => String.new( 3732 | "key_f61", 3733 | "kf61", 3734 | "str", 3735 | "Fp", 3736 | "KEY_F(61)", 3737 | "-", 3738 | "----E", 3739 | "F61 function key", 3740 | 266, 3741 | ).freeze, 3742 | "kf62" => String.new( 3743 | "key_f62", 3744 | "kf62", 3745 | "str", 3746 | "Fq", 3747 | "KEY_F(62)", 3748 | "-", 3749 | "----E", 3750 | "F62 function key", 3751 | 267, 3752 | ).freeze, 3753 | "kf63" => String.new( 3754 | "key_f63", 3755 | "kf63", 3756 | "str", 3757 | "Fr", 3758 | "KEY_F(63)", 3759 | "-", 3760 | "----E", 3761 | "F63 function key", 3762 | 268, 3763 | ).freeze, 3764 | "el1" => String.new( 3765 | "clr_bol", 3766 | "el1", 3767 | "str", 3768 | "cb", 3769 | "-", 3770 | "-", 3771 | "-----", 3772 | "Clear to beginning of line", 3773 | 269, 3774 | ).freeze, 3775 | "mgc" => String.new( 3776 | "clear_margins", 3777 | "mgc", 3778 | "str", 3779 | "MC", 3780 | "-", 3781 | "-", 3782 | "-----", 3783 | "clear right and left soft margins", 3784 | 270, 3785 | ).freeze, 3786 | "smgl" => String.new( 3787 | "set_left_margin", 3788 | "smgl", 3789 | "str", 3790 | "ML", 3791 | "-", 3792 | "-", 3793 | "-----", 3794 | "set left soft margin at current column (not in BSD \\fItermcap\\fP)", 3795 | 271, 3796 | ).freeze, 3797 | "smgr" => String.new( 3798 | "set_right_margin", 3799 | "smgr", 3800 | "str", 3801 | "MR", 3802 | "-", 3803 | "-", 3804 | "-----", 3805 | "set right soft margin at current column", 3806 | 272, 3807 | ).freeze, 3808 | "fln" => String.new( 3809 | "label_format", 3810 | "fln", 3811 | "str", 3812 | "Lf", 3813 | "-", 3814 | "-", 3815 | "-----", 3816 | "label format", 3817 | 273, 3818 | ).freeze, 3819 | "sclk" => String.new( 3820 | "set_clock", 3821 | "sclk", 3822 | "str", 3823 | "SC", 3824 | "-", 3825 | "-", 3826 | "-----", 3827 | "set clock, #1 hrs #2 mins #3 secs", 3828 | 274, 3829 | ).freeze, 3830 | "dclk" => String.new( 3831 | "display_clock", 3832 | "dclk", 3833 | "str", 3834 | "DK", 3835 | "-", 3836 | "-", 3837 | "-----", 3838 | "display clock", 3839 | 275, 3840 | ).freeze, 3841 | "rmclk" => String.new( 3842 | "remove_clock", 3843 | "rmclk", 3844 | "str", 3845 | "RC", 3846 | "-", 3847 | "-", 3848 | "-----", 3849 | "remove clock", 3850 | 276, 3851 | ).freeze, 3852 | "cwin" => String.new( 3853 | "create_window", 3854 | "cwin", 3855 | "str", 3856 | "CW", 3857 | "-", 3858 | "-", 3859 | "-----", 3860 | "define a window #1 from #2,#3 to #4,#5", 3861 | 277, 3862 | ).freeze, 3863 | "wingo" => String.new( 3864 | "goto_window", 3865 | "wingo", 3866 | "str", 3867 | "WG", 3868 | "-", 3869 | "-", 3870 | "-----", 3871 | "go to window #1", 3872 | 278, 3873 | ).freeze, 3874 | "hup" => String.new( 3875 | "hangup", 3876 | "hup", 3877 | "str", 3878 | "HU", 3879 | "-", 3880 | "-", 3881 | "-----", 3882 | "hang-up phone", 3883 | 279, 3884 | ).freeze, 3885 | "dial" => String.new( 3886 | "dial_phone", 3887 | "dial", 3888 | "str", 3889 | "DI", 3890 | "-", 3891 | "-", 3892 | "-----", 3893 | "dial number #1", 3894 | 280, 3895 | ).freeze, 3896 | "qdial" => String.new( 3897 | "quick_dial", 3898 | "qdial", 3899 | "str", 3900 | "QD", 3901 | "-", 3902 | "-", 3903 | "-----", 3904 | "dial number #1 without checking", 3905 | 281, 3906 | ).freeze, 3907 | "tone" => String.new( 3908 | "tone", 3909 | "tone", 3910 | "str", 3911 | "TO", 3912 | "-", 3913 | "-", 3914 | "-----", 3915 | "select touch tone dialing", 3916 | 282, 3917 | ).freeze, 3918 | "pulse" => String.new( 3919 | "pulse", 3920 | "pulse", 3921 | "str", 3922 | "PU", 3923 | "-", 3924 | "-", 3925 | "-----", 3926 | "select pulse dialing", 3927 | 283, 3928 | ).freeze, 3929 | "hook" => String.new( 3930 | "flash_hook", 3931 | "hook", 3932 | "str", 3933 | "fh", 3934 | "-", 3935 | "-", 3936 | "-----", 3937 | "flash switch hook", 3938 | 284, 3939 | ).freeze, 3940 | "pause" => String.new( 3941 | "fixed_pause", 3942 | "pause", 3943 | "str", 3944 | "PA", 3945 | "-", 3946 | "-", 3947 | "-----", 3948 | "pause for 2-3 seconds", 3949 | 285, 3950 | ).freeze, 3951 | "wait" => String.new( 3952 | "wait_tone", 3953 | "wait", 3954 | "str", 3955 | "WA", 3956 | "-", 3957 | "-", 3958 | "-----", 3959 | "wait for dial-tone", 3960 | 286, 3961 | ).freeze, 3962 | "u0" => String.new( 3963 | "user0", 3964 | "u0", 3965 | "str", 3966 | "u0", 3967 | "-", 3968 | "-", 3969 | "-----", 3970 | "User string #0", 3971 | 287, 3972 | ).freeze, 3973 | "u1" => String.new( 3974 | "user1", 3975 | "u1", 3976 | "str", 3977 | "u1", 3978 | "-", 3979 | "-", 3980 | "-----", 3981 | "User string #1", 3982 | 288, 3983 | ).freeze, 3984 | "u2" => String.new( 3985 | "user2", 3986 | "u2", 3987 | "str", 3988 | "u2", 3989 | "-", 3990 | "-", 3991 | "-----", 3992 | "User string #2", 3993 | 289, 3994 | ).freeze, 3995 | "u3" => String.new( 3996 | "user3", 3997 | "u3", 3998 | "str", 3999 | "u3", 4000 | "-", 4001 | "-", 4002 | "-----", 4003 | "User string #3", 4004 | 290, 4005 | ).freeze, 4006 | "u4" => String.new( 4007 | "user4", 4008 | "u4", 4009 | "str", 4010 | "u4", 4011 | "-", 4012 | "-", 4013 | "-----", 4014 | "User string #4", 4015 | 291, 4016 | ).freeze, 4017 | "u5" => String.new( 4018 | "user5", 4019 | "u5", 4020 | "str", 4021 | "u5", 4022 | "-", 4023 | "-", 4024 | "-----", 4025 | "User string #5", 4026 | 292, 4027 | ).freeze, 4028 | "u6" => String.new( 4029 | "user6", 4030 | "u6", 4031 | "str", 4032 | "u6", 4033 | "-", 4034 | "-", 4035 | "-----", 4036 | "User string #6", 4037 | 293, 4038 | ).freeze, 4039 | "u7" => String.new( 4040 | "user7", 4041 | "u7", 4042 | "str", 4043 | "u7", 4044 | "-", 4045 | "-", 4046 | "-----", 4047 | "User string #7", 4048 | 294, 4049 | ).freeze, 4050 | "u8" => String.new( 4051 | "user8", 4052 | "u8", 4053 | "str", 4054 | "u8", 4055 | "-", 4056 | "-", 4057 | "-----", 4058 | "User string #8", 4059 | 295, 4060 | ).freeze, 4061 | "u9" => String.new( 4062 | "user9", 4063 | "u9", 4064 | "str", 4065 | "u9", 4066 | "-", 4067 | "-", 4068 | "-----", 4069 | "User string #9", 4070 | 296, 4071 | ).freeze, 4072 | "op" => String.new( 4073 | "orig_pair", 4074 | "op", 4075 | "str", 4076 | "op", 4077 | "-", 4078 | "-", 4079 | "-----", 4080 | "Set default pair to its original value", 4081 | 297, 4082 | ).freeze, 4083 | "oc" => String.new( 4084 | "orig_colors", 4085 | "oc", 4086 | "str", 4087 | "oc", 4088 | "-", 4089 | "-", 4090 | "-----", 4091 | "Set all color pairs to the original ones", 4092 | 298, 4093 | ).freeze, 4094 | "initc" => String.new( 4095 | "initialize_color", 4096 | "initc", 4097 | "str", 4098 | "Ic", 4099 | "-", 4100 | "-", 4101 | "-----", 4102 | "initialize color #1 to (#2,#3,#4)", 4103 | 299, 4104 | ).freeze, 4105 | "initp" => String.new( 4106 | "initialize_pair", 4107 | "initp", 4108 | "str", 4109 | "Ip", 4110 | "-", 4111 | "-", 4112 | "-----", 4113 | "Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)", 4114 | 300, 4115 | ).freeze, 4116 | "scp" => String.new( 4117 | "set_color_pair", 4118 | "scp", 4119 | "str", 4120 | "sp", 4121 | "-", 4122 | "-", 4123 | "-----", 4124 | "Set current color pair to #1", 4125 | 301, 4126 | ).freeze, 4127 | "setf" => String.new( 4128 | "set_foreground", 4129 | "setf", 4130 | "str", 4131 | "Sf", 4132 | "-", 4133 | "-", 4134 | "-----", 4135 | "Set foreground color #1", 4136 | 302, 4137 | ).freeze, 4138 | "setb" => String.new( 4139 | "set_background", 4140 | "setb", 4141 | "str", 4142 | "Sb", 4143 | "-", 4144 | "-", 4145 | "-----", 4146 | "Set background color #1", 4147 | 303, 4148 | ).freeze, 4149 | "cpi" => String.new( 4150 | "change_char_pitch", 4151 | "cpi", 4152 | "str", 4153 | "ZA", 4154 | "-", 4155 | "-", 4156 | "-----", 4157 | "Change number of characters per inch to #1", 4158 | 304, 4159 | ).freeze, 4160 | "lpi" => String.new( 4161 | "change_line_pitch", 4162 | "lpi", 4163 | "str", 4164 | "ZB", 4165 | "-", 4166 | "-", 4167 | "-----", 4168 | "Change number of lines per inch to #1", 4169 | 305, 4170 | ).freeze, 4171 | "chr" => String.new( 4172 | "change_res_horz", 4173 | "chr", 4174 | "str", 4175 | "ZC", 4176 | "-", 4177 | "-", 4178 | "-----", 4179 | "Change horizontal resolution to #1", 4180 | 306, 4181 | ).freeze, 4182 | "cvr" => String.new( 4183 | "change_res_vert", 4184 | "cvr", 4185 | "str", 4186 | "ZD", 4187 | "-", 4188 | "-", 4189 | "-----", 4190 | "Change vertical resolution to #1", 4191 | 307, 4192 | ).freeze, 4193 | "defc" => String.new( 4194 | "define_char", 4195 | "defc", 4196 | "str", 4197 | "ZE", 4198 | "-", 4199 | "-", 4200 | "-----", 4201 | "Define a character #1, #2 dots wide, descender #3", 4202 | 308, 4203 | ).freeze, 4204 | "swidm" => String.new( 4205 | "enter_doublewide_mode", 4206 | "swidm", 4207 | "str", 4208 | "ZF", 4209 | "-", 4210 | "-", 4211 | "-----", 4212 | "Enter double-wide mode", 4213 | 309, 4214 | ).freeze, 4215 | "sdrfq" => String.new( 4216 | "enter_draft_quality", 4217 | "sdrfq", 4218 | "str", 4219 | "ZG", 4220 | "-", 4221 | "-", 4222 | "-----", 4223 | "Enter draft-quality mode", 4224 | 310, 4225 | ).freeze, 4226 | "sitm" => String.new( 4227 | "enter_italics_mode", 4228 | "sitm", 4229 | "str", 4230 | "ZH", 4231 | "-", 4232 | "-", 4233 | "-----", 4234 | "Enter italic mode", 4235 | 311, 4236 | ).freeze, 4237 | "slm" => String.new( 4238 | "enter_leftward_mode", 4239 | "slm", 4240 | "str", 4241 | "ZI", 4242 | "-", 4243 | "-", 4244 | "-----", 4245 | "Start leftward carriage motion", 4246 | 312, 4247 | ).freeze, 4248 | "smicm" => String.new( 4249 | "enter_micro_mode", 4250 | "smicm", 4251 | "str", 4252 | "ZJ", 4253 | "-", 4254 | "-", 4255 | "-----", 4256 | "Start micro-motion mode", 4257 | 313, 4258 | ).freeze, 4259 | "snlq" => String.new( 4260 | "enter_near_letter_quality", 4261 | "snlq", 4262 | "str", 4263 | "ZK", 4264 | "-", 4265 | "-", 4266 | "-----", 4267 | "Enter NLQ mode", 4268 | 314, 4269 | ).freeze, 4270 | "snrmq" => String.new( 4271 | "enter_normal_quality", 4272 | "snrmq", 4273 | "str", 4274 | "ZL", 4275 | "-", 4276 | "-", 4277 | "-----", 4278 | "Enter normal-quality mode", 4279 | 315, 4280 | ).freeze, 4281 | "sshm" => String.new( 4282 | "enter_shadow_mode", 4283 | "sshm", 4284 | "str", 4285 | "ZM", 4286 | "-", 4287 | "-", 4288 | "-----", 4289 | "Enter shadow-print mode", 4290 | 316, 4291 | ).freeze, 4292 | "ssubm" => String.new( 4293 | "enter_subscript_mode", 4294 | "ssubm", 4295 | "str", 4296 | "ZN", 4297 | "-", 4298 | "-", 4299 | "-----", 4300 | "Enter subscript mode", 4301 | 317, 4302 | ).freeze, 4303 | "ssupm" => String.new( 4304 | "enter_superscript_mode", 4305 | "ssupm", 4306 | "str", 4307 | "ZO", 4308 | "-", 4309 | "-", 4310 | "-----", 4311 | "Enter superscript mode", 4312 | 318, 4313 | ).freeze, 4314 | "sum" => String.new( 4315 | "enter_upward_mode", 4316 | "sum", 4317 | "str", 4318 | "ZP", 4319 | "-", 4320 | "-", 4321 | "-----", 4322 | "Start upward carriage motion", 4323 | 319, 4324 | ).freeze, 4325 | "rwidm" => String.new( 4326 | "exit_doublewide_mode", 4327 | "rwidm", 4328 | "str", 4329 | "ZQ", 4330 | "-", 4331 | "-", 4332 | "-----", 4333 | "End double-wide mode", 4334 | 320, 4335 | ).freeze, 4336 | "ritm" => String.new( 4337 | "exit_italics_mode", 4338 | "ritm", 4339 | "str", 4340 | "ZR", 4341 | "-", 4342 | "-", 4343 | "-----", 4344 | "End italic mode", 4345 | 321, 4346 | ).freeze, 4347 | "rlm" => String.new( 4348 | "exit_leftward_mode", 4349 | "rlm", 4350 | "str", 4351 | "ZS", 4352 | "-", 4353 | "-", 4354 | "-----", 4355 | "End left-motion mode", 4356 | 322, 4357 | ).freeze, 4358 | "rmicm" => String.new( 4359 | "exit_micro_mode", 4360 | "rmicm", 4361 | "str", 4362 | "ZT", 4363 | "-", 4364 | "-", 4365 | "-----", 4366 | "End micro-motion mode", 4367 | 323, 4368 | ).freeze, 4369 | "rshm" => String.new( 4370 | "exit_shadow_mode", 4371 | "rshm", 4372 | "str", 4373 | "ZU", 4374 | "-", 4375 | "-", 4376 | "-----", 4377 | "End shadow-print mode", 4378 | 324, 4379 | ).freeze, 4380 | "rsubm" => String.new( 4381 | "exit_subscript_mode", 4382 | "rsubm", 4383 | "str", 4384 | "ZV", 4385 | "-", 4386 | "-", 4387 | "-----", 4388 | "End subscript mode", 4389 | 325, 4390 | ).freeze, 4391 | "rsupm" => String.new( 4392 | "exit_superscript_mode", 4393 | "rsupm", 4394 | "str", 4395 | "ZW", 4396 | "-", 4397 | "-", 4398 | "-----", 4399 | "End superscript mode", 4400 | 326, 4401 | ).freeze, 4402 | "rum" => String.new( 4403 | "exit_upward_mode", 4404 | "rum", 4405 | "str", 4406 | "ZX", 4407 | "-", 4408 | "-", 4409 | "-----", 4410 | "End reverse character motion", 4411 | 327, 4412 | ).freeze, 4413 | "mhpa" => String.new( 4414 | "micro_column_address", 4415 | "mhpa", 4416 | "str", 4417 | "ZY", 4418 | "-", 4419 | "-", 4420 | "-----", 4421 | "Like column_address in micro mode", 4422 | 328, 4423 | ).freeze, 4424 | "mcud1" => String.new( 4425 | "micro_down", 4426 | "mcud1", 4427 | "str", 4428 | "ZZ", 4429 | "-", 4430 | "-", 4431 | "-----", 4432 | "Like cursor_down in micro mode", 4433 | 329, 4434 | ).freeze, 4435 | "mcub1" => String.new( 4436 | "micro_left", 4437 | "mcub1", 4438 | "str", 4439 | "Za", 4440 | "-", 4441 | "-", 4442 | "-----", 4443 | "Like cursor_left in micro mode", 4444 | 330, 4445 | ).freeze, 4446 | "mcuf1" => String.new( 4447 | "micro_right", 4448 | "mcuf1", 4449 | "str", 4450 | "Zb", 4451 | "-", 4452 | "-", 4453 | "-----", 4454 | "Like cursor_right in micro mode", 4455 | 331, 4456 | ).freeze, 4457 | "mvpa" => String.new( 4458 | "micro_row_address", 4459 | "mvpa", 4460 | "str", 4461 | "Zc", 4462 | "-", 4463 | "-", 4464 | "-----", 4465 | "Like row_address #1 in micro mode", 4466 | 332, 4467 | ).freeze, 4468 | "mcuu1" => String.new( 4469 | "micro_up", 4470 | "mcuu1", 4471 | "str", 4472 | "Zd", 4473 | "-", 4474 | "-", 4475 | "-----", 4476 | "Like cursor_up in micro mode", 4477 | 333, 4478 | ).freeze, 4479 | "porder" => String.new( 4480 | "order_of_pins", 4481 | "porder", 4482 | "str", 4483 | "Ze", 4484 | "-", 4485 | "-", 4486 | "-----", 4487 | "Match software bits to print-head pins", 4488 | 334, 4489 | ).freeze, 4490 | "mcud" => String.new( 4491 | "parm_down_micro", 4492 | "mcud", 4493 | "str", 4494 | "Zf", 4495 | "-", 4496 | "-", 4497 | "-----", 4498 | "Like parm_down_cursor in micro mode", 4499 | 335, 4500 | ).freeze, 4501 | "mcub" => String.new( 4502 | "parm_left_micro", 4503 | "mcub", 4504 | "str", 4505 | "Zg", 4506 | "-", 4507 | "-", 4508 | "-----", 4509 | "Like parm_left_cursor in micro mode", 4510 | 336, 4511 | ).freeze, 4512 | "mcuf" => String.new( 4513 | "parm_right_micro", 4514 | "mcuf", 4515 | "str", 4516 | "Zh", 4517 | "-", 4518 | "-", 4519 | "-----", 4520 | "Like parm_right_cursor in micro mode", 4521 | 337, 4522 | ).freeze, 4523 | "mcuu" => String.new( 4524 | "parm_up_micro", 4525 | "mcuu", 4526 | "str", 4527 | "Zi", 4528 | "-", 4529 | "-", 4530 | "-----", 4531 | "Like parm_up_cursor in micro mode", 4532 | 338, 4533 | ).freeze, 4534 | "scs" => String.new( 4535 | "select_char_set", 4536 | "scs", 4537 | "str", 4538 | "Zj", 4539 | "-", 4540 | "-", 4541 | "-----", 4542 | "Select character set, #1", 4543 | 339, 4544 | ).freeze, 4545 | "smgb" => String.new( 4546 | "set_bottom_margin", 4547 | "smgb", 4548 | "str", 4549 | "Zk", 4550 | "-", 4551 | "-", 4552 | "-----", 4553 | "Set bottom margin at current line", 4554 | 340, 4555 | ).freeze, 4556 | "smgbp" => String.new( 4557 | "set_bottom_margin_parm", 4558 | "smgbp", 4559 | "str", 4560 | "Zl", 4561 | "-", 4562 | "-", 4563 | "-----", 4564 | "Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom", 4565 | 341, 4566 | ).freeze, 4567 | "smglp" => String.new( 4568 | "set_left_margin_parm", 4569 | "smglp", 4570 | "str", 4571 | "Zm", 4572 | "-", 4573 | "-", 4574 | "-----", 4575 | "Set left (right) margin at column #1", 4576 | 342, 4577 | ).freeze, 4578 | "smgrp" => String.new( 4579 | "set_right_margin_parm", 4580 | "smgrp", 4581 | "str", 4582 | "Zn", 4583 | "-", 4584 | "-", 4585 | "-----", 4586 | "Set right margin at column #1", 4587 | 343, 4588 | ).freeze, 4589 | "smgt" => String.new( 4590 | "set_top_margin", 4591 | "smgt", 4592 | "str", 4593 | "Zo", 4594 | "-", 4595 | "-", 4596 | "-----", 4597 | "Set top margin at current line", 4598 | 344, 4599 | ).freeze, 4600 | "smgtp" => String.new( 4601 | "set_top_margin_parm", 4602 | "smgtp", 4603 | "str", 4604 | "Zp", 4605 | "-", 4606 | "-", 4607 | "-----", 4608 | "Set top (bottom) margin at row #1", 4609 | 345, 4610 | ).freeze, 4611 | "sbim" => String.new( 4612 | "start_bit_image", 4613 | "sbim", 4614 | "str", 4615 | "Zq", 4616 | "-", 4617 | "-", 4618 | "-----", 4619 | "Start printing bit image graphics", 4620 | 346, 4621 | ).freeze, 4622 | "scsd" => String.new( 4623 | "start_char_set_def", 4624 | "scsd", 4625 | "str", 4626 | "Zr", 4627 | "-", 4628 | "-", 4629 | "-----", 4630 | "Start character set definition #1, with #2 characters in the set", 4631 | 347, 4632 | ).freeze, 4633 | "rbim" => String.new( 4634 | "stop_bit_image", 4635 | "rbim", 4636 | "str", 4637 | "Zs", 4638 | "-", 4639 | "-", 4640 | "-----", 4641 | "Stop printing bit image graphics", 4642 | 348, 4643 | ).freeze, 4644 | "rcsd" => String.new( 4645 | "stop_char_set_def", 4646 | "rcsd", 4647 | "str", 4648 | "Zt", 4649 | "-", 4650 | "-", 4651 | "-----", 4652 | "End definition of character set #1", 4653 | 349, 4654 | ).freeze, 4655 | "subcs" => String.new( 4656 | "subscript_characters", 4657 | "subcs", 4658 | "str", 4659 | "Zu", 4660 | "-", 4661 | "-", 4662 | "-----", 4663 | "List of subscriptable characters", 4664 | 350, 4665 | ).freeze, 4666 | "supcs" => String.new( 4667 | "superscript_characters", 4668 | "supcs", 4669 | "str", 4670 | "Zv", 4671 | "-", 4672 | "-", 4673 | "-----", 4674 | "List of superscriptable characters", 4675 | 351, 4676 | ).freeze, 4677 | "docr" => String.new( 4678 | "these_cause_cr", 4679 | "docr", 4680 | "str", 4681 | "Zw", 4682 | "-", 4683 | "-", 4684 | "-----", 4685 | "Printing any of these characters causes CR", 4686 | 352, 4687 | ).freeze, 4688 | "zerom" => String.new( 4689 | "zero_motion", 4690 | "zerom", 4691 | "str", 4692 | "Zx", 4693 | "-", 4694 | "-", 4695 | "-----", 4696 | "No motion for subsequent character", 4697 | 353, 4698 | ).freeze, 4699 | "csnm" => String.new( 4700 | "char_set_names", 4701 | "csnm", 4702 | "str", 4703 | "Zy", 4704 | "-", 4705 | "-", 4706 | "-----", 4707 | "Produce #1'th item from list of character set names", 4708 | 354, 4709 | ).freeze, 4710 | "kmous" => String.new( 4711 | "key_mouse", 4712 | "kmous", 4713 | "str", 4714 | "Km", 4715 | "KEY_MOUSE", 4716 | "0631", 4717 | "-----", 4718 | "Mouse event has occurred", 4719 | 355, 4720 | ).freeze, 4721 | "minfo" => String.new( 4722 | "mouse_info", 4723 | "minfo", 4724 | "str", 4725 | "Mi", 4726 | "-", 4727 | "-", 4728 | "-----", 4729 | "Mouse status information", 4730 | 356, 4731 | ).freeze, 4732 | "reqmp" => String.new( 4733 | "req_mouse_pos", 4734 | "reqmp", 4735 | "str", 4736 | "RQ", 4737 | "-", 4738 | "-", 4739 | "-----", 4740 | "Request mouse position", 4741 | 357, 4742 | ).freeze, 4743 | "getm" => String.new( 4744 | "get_mouse", 4745 | "getm", 4746 | "str", 4747 | "Gm", 4748 | "-", 4749 | "-", 4750 | "-----", 4751 | "Curses should get button events, parameter #1 not documented.", 4752 | 358, 4753 | ).freeze, 4754 | "setaf" => String.new( 4755 | "set_a_foreground", 4756 | "setaf", 4757 | "str", 4758 | "AF", 4759 | "-", 4760 | "-", 4761 | "-----", 4762 | "Set foreground color to #1, using ANSI escape", 4763 | 359, 4764 | ).freeze, 4765 | "setab" => String.new( 4766 | "set_a_background", 4767 | "setab", 4768 | "str", 4769 | "AB", 4770 | "-", 4771 | "-", 4772 | "-----", 4773 | "Set background color to #1, using ANSI escape", 4774 | 360, 4775 | ).freeze, 4776 | "pfxl" => String.new( 4777 | "pkey_plab", 4778 | "pfxl", 4779 | "str", 4780 | "xl", 4781 | "-", 4782 | "-", 4783 | "-----", 4784 | "Program function key #1 to type string #2 and show string #3", 4785 | 361, 4786 | ).freeze, 4787 | "devt" => String.new( 4788 | "device_type", 4789 | "devt", 4790 | "str", 4791 | "dv", 4792 | "-", 4793 | "-", 4794 | "-----", 4795 | "Indicate language, codeset support", 4796 | 362, 4797 | ).freeze, 4798 | "csin" => String.new( 4799 | "code_set_init", 4800 | "csin", 4801 | "str", 4802 | "ci", 4803 | "-", 4804 | "-", 4805 | "-----", 4806 | "Init sequence for multiple codesets", 4807 | 363, 4808 | ).freeze, 4809 | "s0ds" => String.new( 4810 | "set0_des_seq", 4811 | "s0ds", 4812 | "str", 4813 | "s0", 4814 | "-", 4815 | "-", 4816 | "-----", 4817 | "Shift to codeset 0 (EUC set 0, ASCII)", 4818 | 364, 4819 | ).freeze, 4820 | "s1ds" => String.new( 4821 | "set1_des_seq", 4822 | "s1ds", 4823 | "str", 4824 | "s1", 4825 | "-", 4826 | "-", 4827 | "-----", 4828 | "Shift to codeset 1", 4829 | 365, 4830 | ).freeze, 4831 | "s2ds" => String.new( 4832 | "set2_des_seq", 4833 | "s2ds", 4834 | "str", 4835 | "s2", 4836 | "-", 4837 | "-", 4838 | "-----", 4839 | "Shift to codeset 2", 4840 | 366, 4841 | ).freeze, 4842 | "s3ds" => String.new( 4843 | "set3_des_seq", 4844 | "s3ds", 4845 | "str", 4846 | "s3", 4847 | "-", 4848 | "-", 4849 | "-----", 4850 | "Shift to codeset 3", 4851 | 367, 4852 | ).freeze, 4853 | "smglr" => String.new( 4854 | "set_lr_margin", 4855 | "smglr", 4856 | "str", 4857 | "ML", 4858 | "-", 4859 | "-", 4860 | "-----", 4861 | "Set both left and right margins to #1, #2. (ML is not in BSD termcap).", 4862 | 368, 4863 | ).freeze, 4864 | "smgtb" => String.new( 4865 | "set_tb_margin", 4866 | "smgtb", 4867 | "str", 4868 | "MT", 4869 | "-", 4870 | "-", 4871 | "-----", 4872 | "Sets both top and bottom margins to #1, #2", 4873 | 369, 4874 | ).freeze, 4875 | "birep" => String.new( 4876 | "bit_image_repeat", 4877 | "birep", 4878 | "str", 4879 | "Xy", 4880 | "-", 4881 | "-", 4882 | "-----", 4883 | "Repeat bit image cell #1 #2 times", 4884 | 370, 4885 | ).freeze, 4886 | "binel" => String.new( 4887 | "bit_image_newline", 4888 | "binel", 4889 | "str", 4890 | "Zz", 4891 | "-", 4892 | "-", 4893 | "-----", 4894 | "Move to next row of the bit image", 4895 | 371, 4896 | ).freeze, 4897 | "bicr" => String.new( 4898 | "bit_image_carriage_return", 4899 | "bicr", 4900 | "str", 4901 | "Yv", 4902 | "-", 4903 | "-", 4904 | "-----", 4905 | "Move to beginning of same row", 4906 | 372, 4907 | ).freeze, 4908 | "colornm" => String.new( 4909 | "color_names", 4910 | "colornm", 4911 | "str", 4912 | "Yw", 4913 | "-", 4914 | "-", 4915 | "-----", 4916 | "Give name for color #1", 4917 | 373, 4918 | ).freeze, 4919 | "defbi" => String.new( 4920 | "define_bit_image_region", 4921 | "defbi", 4922 | "str", 4923 | "Yx", 4924 | "-", 4925 | "-", 4926 | "-----", 4927 | "Define rectangular bit image region", 4928 | 374, 4929 | ).freeze, 4930 | "endbi" => String.new( 4931 | "end_bit_image_region", 4932 | "endbi", 4933 | "str", 4934 | "Yy", 4935 | "-", 4936 | "-", 4937 | "-----", 4938 | "End a bit-image region", 4939 | 375, 4940 | ).freeze, 4941 | "setcolor" => String.new( 4942 | "set_color_band", 4943 | "setcolor", 4944 | "str", 4945 | "Yz", 4946 | "-", 4947 | "-", 4948 | "-----", 4949 | "Change to ribbon color #1", 4950 | 376, 4951 | ).freeze, 4952 | "slines" => String.new( 4953 | "set_page_length", 4954 | "slines", 4955 | "str", 4956 | "YZ", 4957 | "-", 4958 | "-", 4959 | "-----", 4960 | "Set page length to #1 lines", 4961 | 377, 4962 | ).freeze, 4963 | "dispc" => String.new( 4964 | "display_pc_char", 4965 | "dispc", 4966 | "str", 4967 | "S1", 4968 | "-", 4969 | "-", 4970 | "-----", 4971 | "Display PC character #1", 4972 | 378, 4973 | ).freeze, 4974 | "smpch" => String.new( 4975 | "enter_pc_charset_mode", 4976 | "smpch", 4977 | "str", 4978 | "S2", 4979 | "-", 4980 | "-", 4981 | "-----", 4982 | "Enter PC character display mode", 4983 | 379, 4984 | ).freeze, 4985 | "rmpch" => String.new( 4986 | "exit_pc_charset_mode", 4987 | "rmpch", 4988 | "str", 4989 | "S3", 4990 | "-", 4991 | "-", 4992 | "-----", 4993 | "Exit PC character display mode", 4994 | 380, 4995 | ).freeze, 4996 | "smsc" => String.new( 4997 | "enter_scancode_mode", 4998 | "smsc", 4999 | "str", 5000 | "S4", 5001 | "-", 5002 | "-", 5003 | "-----", 5004 | "Enter PC scancode mode", 5005 | 381, 5006 | ).freeze, 5007 | "rmsc" => String.new( 5008 | "exit_scancode_mode", 5009 | "rmsc", 5010 | "str", 5011 | "S5", 5012 | "-", 5013 | "-", 5014 | "-----", 5015 | "Exit PC scancode mode", 5016 | 382, 5017 | ).freeze, 5018 | "pctrm" => String.new( 5019 | "pc_term_options", 5020 | "pctrm", 5021 | "str", 5022 | "S6", 5023 | "-", 5024 | "-", 5025 | "-----", 5026 | "PC terminal options", 5027 | 383, 5028 | ).freeze, 5029 | "scesc" => String.new( 5030 | "scancode_escape", 5031 | "scesc", 5032 | "str", 5033 | "S7", 5034 | "-", 5035 | "-", 5036 | "-----", 5037 | "Escape for scancode emulation", 5038 | 384, 5039 | ).freeze, 5040 | "scesa" => String.new( 5041 | "alt_scancode_esc", 5042 | "scesa", 5043 | "str", 5044 | "S8", 5045 | "-", 5046 | "-", 5047 | "-----", 5048 | "Alternate escape for scancode emulation", 5049 | 385, 5050 | ).freeze, 5051 | "ehhlm" => String.new( 5052 | "enter_horizontal_hl_mode", 5053 | "ehhlm", 5054 | "str", 5055 | "Xh", 5056 | "-", 5057 | "-", 5058 | "-----", 5059 | "Enter horizontal highlight mode", 5060 | 386, 5061 | ).freeze, 5062 | "elhlm" => String.new( 5063 | "enter_left_hl_mode", 5064 | "elhlm", 5065 | "str", 5066 | "Xl", 5067 | "-", 5068 | "-", 5069 | "-----", 5070 | "Enter left highlight mode", 5071 | 387, 5072 | ).freeze, 5073 | "elohlm" => String.new( 5074 | "enter_low_hl_mode", 5075 | "elohlm", 5076 | "str", 5077 | "Xo", 5078 | "-", 5079 | "-", 5080 | "-----", 5081 | "Enter low highlight mode", 5082 | 388, 5083 | ).freeze, 5084 | "erhlm" => String.new( 5085 | "enter_right_hl_mode", 5086 | "erhlm", 5087 | "str", 5088 | "Xr", 5089 | "-", 5090 | "-", 5091 | "-----", 5092 | "Enter right highlight mode", 5093 | 389, 5094 | ).freeze, 5095 | "ethlm" => String.new( 5096 | "enter_top_hl_mode", 5097 | "ethlm", 5098 | "str", 5099 | "Xt", 5100 | "-", 5101 | "-", 5102 | "-----", 5103 | "Enter top highlight mode", 5104 | 390, 5105 | ).freeze, 5106 | "evhlm" => String.new( 5107 | "enter_vertical_hl_mode", 5108 | "evhlm", 5109 | "str", 5110 | "Xv", 5111 | "-", 5112 | "-", 5113 | "-----", 5114 | "Enter vertical highlight mode", 5115 | 391, 5116 | ).freeze, 5117 | "sgr1" => String.new( 5118 | "set_a_attributes", 5119 | "sgr1", 5120 | "str", 5121 | "sA", 5122 | "-", 5123 | "-", 5124 | "-----", 5125 | "Define second set of video attributes #1-#6", 5126 | 392, 5127 | ).freeze, 5128 | "slength" => String.new( 5129 | "set_pglen_inch", 5130 | "slength", 5131 | "str", 5132 | "YI", 5133 | "-", 5134 | "-", 5135 | "-----", 5136 | "Set page length to #1 hundredth of an inch (some implementations use sL for termcap).", 5137 | 393, 5138 | ).freeze, 5139 | }.freeze 5140 | STRING_LIST = STRINGS.values 5141 | end 5142 | end 5143 | # :startdoc: 5144 | -------------------------------------------------------------------------------- /lib/termtime/terminfo.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "termtime/db" 4 | 5 | module TermTime 6 | class TermInfo 7 | class Number 8 | attr_reader :value, :db 9 | 10 | def initialize v, db 11 | @value = v 12 | @db = db 13 | freeze 14 | end 15 | 16 | def tiname; @db.tiname; end 17 | end 18 | 19 | class String 20 | attr_reader :value, :db 21 | 22 | def initialize v, db 23 | @value = v 24 | @db = db 25 | freeze 26 | end 27 | 28 | def tiname; @db.tiname; end 29 | 30 | def tparm(...) 31 | TermTime.tparm(value, ...) 32 | end 33 | end 34 | 35 | def initialize fname = ENV["TERM"] 36 | unless File.file? fname 37 | fname = "/usr/share/terminfo/#{fname.getbyte(0).to_s(16)}/#{fname}" 38 | end 39 | 40 | File.open fname, "rb" do |f| 41 | magic, 42 | names_size, 43 | booleans_size, 44 | short_int_count, 45 | offset_count, 46 | string_table_size = f.read((2 * 6)).unpack("ssssss") 47 | 48 | raise unless magic == 0432 49 | @names = f.read(names_size - 1).force_encoding("UTF-8").freeze 50 | raise unless f.readbyte == 0 51 | @flags = f.read(booleans_size - 1) 52 | 53 | f.readbyte 54 | f.readbyte if f.pos % 2 != 0 # alignment 55 | 56 | @numbers = f.read(short_int_count * 2) 57 | strings = f.read(offset_count * 2) 58 | string_table = f.read(string_table_size) 59 | @strings = decode_strings(strings, string_table) 60 | end 61 | end 62 | 63 | def flags 64 | flags = [] 65 | @flags.bytesize.times do |i| 66 | if @flags.getbyte(i) > 0 67 | flags << DB::BOOLEAN_LIST.fetch(i) 68 | end 69 | end 70 | flags 71 | end 72 | 73 | def numbers 74 | numbers = [] 75 | @numbers.unpack("s*").each_with_index do |v, i| 76 | next if v == -1 77 | numbers << Number.new(v, DB::NUMBER_LIST.fetch(i)) 78 | end 79 | numbers 80 | end 81 | 82 | def strings 83 | @strings.values 84 | end 85 | 86 | def getnum name 87 | offset = DB::NUMBERS.fetch(name).i * 2 88 | @numbers.getbyte(offset) | (@numbers.getbyte(offset + 1) << 8) 89 | end 90 | 91 | def getflag name 92 | @flags.getbyte(DB::BOOLEANS.fetch(name).i) == 1 93 | end 94 | 95 | def getstr name 96 | str(name).value 97 | end 98 | 99 | def str name 100 | @strings.fetch(name) 101 | end 102 | 103 | def str? name 104 | @strings.key?(name) 105 | end 106 | 107 | def names 108 | @names.split("|") 109 | end 110 | 111 | private 112 | 113 | def decode_strings str_offsets, string_table 114 | strings = {} 115 | str_offsets.unpack("s*").each_with_index do |v, i| 116 | next if v == -1 117 | next if i >= DB::STRING_LIST.length 118 | 119 | len = string_table.byteindex("\0", v) - v 120 | str = string_table.byteslice(v, len).freeze 121 | x = DB::STRING_LIST.fetch(i) 122 | strings[x.tiname] = String.new(str, x) 123 | end 124 | strings 125 | end 126 | end 127 | end 128 | -------------------------------------------------------------------------------- /lib/termtime/version.rb: -------------------------------------------------------------------------------- 1 | module TermTime 2 | VERSION = "1.0.0" 3 | end 4 | -------------------------------------------------------------------------------- /templates/lib/termtime/db.rb.erb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # GENERATED FILE, DO NOT EDIT 4 | # :stopdoc: 5 | module TermTime 6 | module DB 7 | class Capability 8 | attr_reader :name, :tiname, :titype, :tcname, :key_name, :value, :flags, :desc, :i 9 | 10 | def initialize(name, tiname, titype, tcname, key_name, value, flags, desc, i) 11 | @name = name 12 | @tiname = tiname 13 | @titype = titype 14 | @tcname = tcname 15 | @key_name = key_name 16 | @value = value 17 | @flags = flags 18 | @desc = desc 19 | @i = i 20 | end 21 | end 22 | class Boolean < Capability; end 23 | class Number < Capability; end 24 | class String < Capability; end 25 | 26 | BOOLEANS = { 27 | <% info["bool"].each_with_index do |bool, i| %> 28 | <%= bool[1].dump %> => Boolean.new( 29 | <% bool.map(&:dump).each do |f| %> 30 | <%= f %>, 31 | <% end %> 32 | <%= i %>, 33 | ).freeze, 34 | <% end %> 35 | }.freeze 36 | BOOLEAN_LIST = BOOLEANS.values 37 | 38 | NUMBERS = { 39 | <% info["num"].each_with_index do |bool, i| %> 40 | <%= bool[1].dump %> => Number.new( 41 | <% bool.map(&:dump).each do |f| %> 42 | <%= f %>, 43 | <% end %> 44 | <%= i %>, 45 | ).freeze, 46 | <% end %> 47 | }.freeze 48 | NUMBER_LIST = NUMBERS.values 49 | 50 | STRINGS = { 51 | <% info["str"].each_with_index do |bool, i| %> 52 | <%= bool[1].dump %> => String.new( 53 | <% bool.map(&:dump).each do |f| %> 54 | <%= f %>, 55 | <% end %> 56 | <%= i %>, 57 | ).freeze, 58 | <% end %> 59 | }.freeze 60 | STRING_LIST = STRINGS.values 61 | end 62 | end 63 | # :startdoc: 64 | -------------------------------------------------------------------------------- /termtime.gemspec: -------------------------------------------------------------------------------- 1 | require_relative "lib/termtime/version" 2 | 3 | Gem::Specification.new do |s| 4 | s.name = "termtime" 5 | s.version = TermTime::VERSION 6 | s.summary = "Pure Ruby terminfo library" 7 | s.description = "This is a pure Ruby terminfo library" 8 | s.authors = [ "Aaron Patterson" ] 9 | s.email = "tenderlove@ruby-lang.org" 10 | s.files = `git ls-files -z`.split("\x0") 11 | s.test_files = s.files.grep(%r{^test/}) 12 | s.homepage = "https://github.com/tenderlove/termtime" 13 | s.license = "Apache-2.0" 14 | 15 | s.add_development_dependency("rake", "~> 13.0") 16 | s.add_development_dependency("minitest", "~> 5.20") 17 | end 18 | -------------------------------------------------------------------------------- /test/fixtures/adm3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tenderlove/termtime/6fb740fda4badc563e804b8a46a6745d5898930e/test/fixtures/adm3 -------------------------------------------------------------------------------- /test/fixtures/adm3a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tenderlove/termtime/6fb740fda4badc563e804b8a46a6745d5898930e/test/fixtures/adm3a -------------------------------------------------------------------------------- /test/fixtures/xterm-256color: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tenderlove/termtime/6fb740fda4badc563e804b8a46a6745d5898930e/test/fixtures/xterm-256color -------------------------------------------------------------------------------- /test/helper.rb: -------------------------------------------------------------------------------- 1 | require "minitest/autorun" 2 | 3 | module TermTime 4 | class Test < Minitest::Test 5 | FIXTURES = File.expand_path(File.join(File.dirname(__FILE__), "fixtures")) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /test/terminfo_test.rb: -------------------------------------------------------------------------------- 1 | require "helper" 2 | require "termtime" 3 | 4 | module TermTime 5 | class TermInfoTest < Test 6 | def test_info 7 | ti = TermInfo.new File.join(FIXTURES, "xterm-256color") 8 | assert_equal ["xterm-256color", "xterm with 256 colors"], ti.names 9 | assert_equal ["am", "bce", "ccc", "xenl", "km", "mir", "msgr", "npc", "mc5i"].sort, ti.flags.map(&:tiname).sort 10 | assert ti.getflag("am") 11 | assert ti.getflag("npc") 12 | assert_equal ["colors", "cols", "it", "lines", "pairs"].sort, ti.numbers.map(&:tiname).sort 13 | assert_equal [256, 80, 8, 24, 32767], ti.numbers.sort_by(&:tiname).map(&:value) 14 | 15 | assert_equal 256, ti.getnum("colors") 16 | assert_equal 24, ti.getnum("lines") 17 | 18 | assert_equal "\e[H\e[2J", ti.getstr("clear") 19 | end 20 | 21 | def test_adm3a 22 | ti = TermInfo.new File.join(FIXTURES, "adm3a") 23 | assert_equal ["adm3a", "lsi adm3a"], ti.names 24 | assert_equal ["am"], ti.flags.map(&:tiname) 25 | assert ti.getflag("am") 26 | refute ti.getflag("npc") 27 | 28 | assert_equal ["cols", "lines"].sort, ti.numbers.map(&:tiname).sort 29 | assert_equal [80, 24], ti.numbers.sort_by(&:tiname).map(&:value) 30 | 31 | assert_equal ["bel", "clear", "cr", "cub1", "cud1", "cuf1", "cup", "cuu1", "home", "ind", "kcub1", "kcud1", "kcuf1", "kcuu1", "rs2"], ti.strings.map(&:tiname).sort 32 | 33 | assert_equal ["\a", "\x1A$<1/>", "\r", "\b", "\n", "\f", "\e=%p1%' '%+%c%p2%' '%+%c", "\v", "\x1E", "\n", "\b", "\n", "\f", "\v", "\x0E"], ti.strings.sort_by(&:tiname).map(&:value) 34 | end 35 | 36 | def test_getstr_tparm 37 | ti = TermInfo.new File.join(FIXTURES, "xterm-256color") 38 | assert_equal "\e[2D", ti.str("cub").tparm(2) 39 | end 40 | 41 | def test_tparm 42 | assert_equal "1;1", TermTime.tparm("%i%p1%d;%p2%d") 43 | assert_equal "0;0", TermTime.tparm("%p1%d;%p2%d") 44 | assert_equal "1;2", TermTime.tparm("%i%p1%d;%p2%d", 0, 1) 45 | assert_equal "true", TermTime.tparm("%p1%ttrue%efalse%;", 1) 46 | assert_equal "false", TermTime.tparm("%p1%ttrue%efalse%;", 0) 47 | assert_equal "8", TermTime.tparm("%{8}%d") 48 | assert_equal "%", TermTime.tparm("%%") 49 | assert_equal [40].pack("C"), TermTime.tparm("%{40}%c") 50 | end 51 | 52 | def test_tparm_lt 53 | assert_equal "less", TermTime.tparm("%?%p1%{8}%<%tless%emore%?", 0) 54 | assert_equal "less", TermTime.tparm("%?%p1%{8}%<%tless%emore%;", 0) 55 | assert_equal "more", TermTime.tparm("%?%p1%{8}%<%tless%emore%;", 8) 56 | end 57 | 58 | def test_tparm_gt 59 | assert_equal "less", TermTime.tparm("%?%p1%{8}%>%tmore%eless%;", 0) 60 | assert_equal "more", TermTime.tparm("%?%p1%{8}%>%tmore%eless%;", 9) 61 | end 62 | 63 | def test_tparm_eq 64 | assert_equal "no", TermTime.tparm("%?%p1%{8}%=%tyes%eno%;", 0) 65 | assert_equal "yes", TermTime.tparm("%?%p1%{8}%=%tyes%eno%;", 8) 66 | end 67 | 68 | def test_tparm_math 69 | assert_equal "9", TermTime.tparm("%{8}%p1%+%d", 1) 70 | assert_equal "7", TermTime.tparm("%{8}%p1%-%d", 1) 71 | assert_equal "16", TermTime.tparm("%{8}%p1%*%d", 2) 72 | assert_equal "4", TermTime.tparm("%{8}%p1%/%d", 2) 73 | assert_equal "1", TermTime.tparm("%{9}%p1%m%d", 2) 74 | end 75 | 76 | def test_tparm_bits 77 | assert_equal "1", TermTime.tparm("%{9}%p1%&%d", 1) 78 | assert_equal "9", TermTime.tparm("%{8}%p1%|%d", 1) 79 | assert_equal "6", TermTime.tparm("%{5}%p1%^%d", 3) 80 | assert_equal "-6", TermTime.tparm("%{5}%~%d") 81 | end 82 | 83 | def test_tparm_bool 84 | assert_equal "1", TermTime.tparm("%{0}%!%d") 85 | assert_equal "0", TermTime.tparm("%{5}%!%d") 86 | end 87 | 88 | def test_tparm_logic 89 | assert_equal "1", TermTime.tparm("%p1%p2%A%d", 1, 5) 90 | assert_equal "0", TermTime.tparm("%p1%p2%A%d", 1, 0) 91 | assert_equal "1", TermTime.tparm("%p1%p2%O%d", 1, 5) 92 | assert_equal "1", TermTime.tparm("%p1%p2%O%d", 1, 0) 93 | end 94 | 95 | def test_tparm_char_constant 96 | assert_equal "65", TermTime.tparm("%'A'%d") 97 | end 98 | 99 | def test_odk 100 | x = "\e]4;1;rgb:00/00/01\e\\" 101 | y = TermTime.tparm("\e]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\e\\", 1, 2, 3, 4) 102 | assert_equal x, y 103 | end 104 | end 105 | end 106 | --------------------------------------------------------------------------------