├── LICENSE ├── README.md ├── completions.sh ├── linecomp.sh ├── readline_funcs.sh └── remaining_commands.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 armoar334 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # linecomp 2 | Beta readline replacement and command suggestion in/for ``bash 4.0+`` 3 | 4 | 5 | 6 | # usage 7 | source linecomp.sh at the end of your bashrc e.g 8 | ``` 9 | source ~/Repos/linecomp/linecomp.sh 10 | ``` 11 | 12 | # Features 13 | Subdirectory / Directory suggestion 14 | Command option suggestion 15 | History based suggestion 16 | Drop in readline replacement - programmatically grabs all your keybinds, so you dont have to worry about interrupting your workflow 17 | 18 | # Goals [percentages are estiamtes] 19 | Emacs mode bindings - ~10% (Most basic shortcuts are implemented, such as forward/backward-word/char, EOL and such) 20 | Suggestions - ~75% 21 | History - 100% 22 | Directory - 80%, only a few edge cases to work out 23 | Argument - 50%, manpage-parsing is fully functional but not as flexible as bash completions. 24 | Vi mode + keybindings - 0% (don't personally use so might never implement) 25 | 26 | # Todo's ( in order of priority (should probably put somewhere else)) 27 | ## URGENT 28 | - Re-implement ``bash-completions``. It was previously implemented, however as it was slow, unreliable and not even guaranteed to work, i have decided to move to a manpage parsing approach. This is also not yet completely working, but as it is far faster and more reliable than bash-completions (not to mention technichally closer to how fish does it), this will be the primary approach for the time being. 29 | 30 | ## Todo 31 | - Figure out why and prevent bash-completions from freezing the prompt when it encounters an issue 32 | - Add all remaining readline functions 33 | - start vi mode implementation 34 | 35 | ## Done / very low priority 36 | - ~~Grab keybinds from env instead of hardcoding, making it a drop in replacement~~ ( It took an almost ground up rewrite, but we now have it!s) 37 | - ~~Stop commiting directly to main~~ (You can't make me) 38 | - ~~Multi-line statements with escapes (works basically, need to do more work on it)~~ (Done, but slow) 39 | - ~~Replace grep with something less susceptible to regex injections / Fix my awful regex's~~ (not really necessary) 40 | - ~~Switch all if/else ladders to case statements for speed~~ (done as much as can be for now) 41 | - ~~Figure out why it runs awful on macos~~ (nvm its just the terminal) 42 | - ~~Implement using ``bash-completions`` scripts for suggesting parameters~~ ~~(done, but still __really__ slow)~~ (re-implement at a later date) 43 | - ~~Stop handling history ourselves and use ``history`` for it~~ (did this ages ago and forgot to change) 44 | 45 | Issues / Suggestions more than welcome! (im practically begging actually) 46 | 47 | ## 23/07/23 48 | linecomp v3 is now here! 49 | Features: 50 | - Better support for Directory names with escaped spaces 51 | - Independant coloring for each option! not everything is red now, and as ```$_color``` is just set to an ansi color code, suggestions can be cutomised to any color you would like 52 | - _string and _curpos are now $READLINE_LINE and $READLINE_POINT, so that any custom function you may have affecting the content or cursor position in your prompt will now be functional 53 | 54 | 55 | ## 14/04/23 56 | linecomp is now completely dependant on env for keybinds. This allows it to be easily used without having to go and manually modify the input case structure 57 | It also means that implementing new readline commands is as easy as writing a fucntion of the same name, allowing features to be added at a much faster rate than previously possible! 58 | 59 | 60 | ~~## 31/01/23~~ 61 | ~~We now have support for `bash-completions`!~~ 62 | ~~Unfortunately its a little slow, but that should be fixed in the coming weeks~~ 63 | This has been removed temporarily in favor of a faster, more reliable manpage-based approach 64 | 65 | 66 | -------------------------------------------------------------------------------- /completions.sh: -------------------------------------------------------------------------------- 1 | # Completions 2 | 3 | comp_complete() { 4 | # We sadly need it to interpret backslashes for directory names 5 | line_array=($READLINE_LINE) 6 | line_array=( "${line_array[@]// /\\ }" ) 7 | local comp_array=( ) 8 | 9 | if [[ "${#line_array[@]}" -gt 1 ]] 10 | then 11 | case "${line_array[-1]}" in 12 | '-'*) 13 | man_completion "${line_array[0]}" "${line_array[-1]}" 14 | readarray -t comp_array <<<"$return_args" 15 | _color="$_option_color" ;; 16 | *) 17 | dir_suggest "${line_array[-1]}" 18 | readarray -t comp_array <<<"$return_path" 19 | _color="$_directory_color" ;; 20 | esac 21 | else 22 | readarray -t comp_array <<<"$_commands" 23 | _color="$_command_color" 24 | fi 25 | 26 | _post_prompt="" 27 | for line in "${comp_array[@]}" 28 | do 29 | case "$line" in 30 | "${line_array[-1]}"*) 31 | line_array[-1]="$line" 32 | _post_prompt="${line_array[*]}" 33 | break ;; 34 | esac 35 | done 36 | } 37 | 38 | dir_suggest() { 39 | local temp_path="$1" 40 | local tilde_yes=false 41 | local complete_path 42 | local unfinish_path 43 | local files 44 | 45 | if [[ "$temp_path" == '~/'* ]]; then 46 | tilde_yes=true 47 | temp_path="${temp_path/~\//"$HOME"\/}" 48 | elif [[ "$temp_path" == '/' ]]; then 49 | temp_path='/' 50 | fi 51 | 52 | complete_path="${temp_path%/*}" 53 | unfinish_path="${temp_path##*/}" 54 | 55 | # If its a directory 56 | if [ -d "${complete_path//\\ / }"/ ]; then 57 | files=$(printf '%q\n' "${complete_path//\\ / }"/*/ "${complete_path//\\ / }"/* ) 58 | # If it isnt yet (current folder) 59 | else 60 | files=$(printf '%q\n' */ *) 61 | fi 62 | return_path=$(while IFS= read -r line; do if [[ "$line" == "$temp_path"* ]]; then printf '%s\n' "$line"; break; fi; done <<<"$files") # This is probably ass but grep is annoying bc of requiring regex escaping 63 | if [ -d "${return_path//\\/}" ]; then 64 | _color="$_directory_color" 65 | else 66 | _color="$_file_color" 67 | fi 68 | 69 | if [ "$tilde_yes" = true ]; then 70 | return_path="${return_path/"$HOME"\//~\/}" 71 | fi 72 | } 73 | 74 | man_completion() { 75 | local man_string 76 | local opt_string 77 | 78 | man_string="$1" 79 | opt_string="$2" 80 | 81 | if [[ "${#opt_string}" -le 1 ]]; 82 | # Command length just makes sure it doesnt re-check every time, mega speed increase 83 | then 84 | if [[ "$OSTYPE" == *darwin* ]]; 85 | then 86 | _man_args=$(man "$man_string" | col -bx | grep -F '-' | tr ' ' $'\n') 2>/dev/null 87 | else 88 | _man_args=$(man -Tascii "$man_string" | col -bx | grep -F '-' | tr ' ' $'\n' ) 2>/dev/null 89 | # This take 0.3 seconds each for the bash page, of which 0.013 is the sorting 90 | # 0.190 IS RIDICULOUS, but also that bc bash's docs are 10,000 pages or smth 91 | # -Tascii take this down by ~0.030 but even then its borderline unusable, all bc of pointless formatting bs 92 | fi 93 | _man_args=$(<<< "${_man_args//[^[:alpha:]]$'\n'/$'\n'}" grep -- '^-'| uniq) 94 | _temp='' 95 | _man_args=$(printf '%s' "$_man_args" | sed -e 's/[^[:alnum:]]$//g') 96 | fi 97 | return_args="$_man_args" 98 | } 99 | -------------------------------------------------------------------------------- /linecomp.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # linecomp V2 4 | # readline "replacment" for bash 5 | 6 | _directory_color='34' 7 | _history_color='35' 8 | _command_color='90' 9 | _option_color='33' 10 | _file_color='32' 11 | 12 | # Check that current shell is bash 13 | # This works under zsh and crashes out on fish, so p much serves its purpose 14 | if [[ "$0" != *"bash"* ]]; 15 | then 16 | echo "Your current shell is not bash, or you did not source the script!" 17 | echo "You must run '. linecomp.sh' and not './linecomp.sh'!" 18 | exit 19 | elif [[ "$(set -o | grep vi)" == *'on' ]] 20 | then 21 | echo "You have vi-mode set!" 22 | echo "vi-mode is not currently implemented, so you will be forced to use your emacs mode currently" 23 | fi 24 | 25 | _linecomp_path="${BASH_SOURCE%/*}" 26 | case "$_linecomp_path" in 27 | "linecomp.sh") _linecomp_path="" ;; 28 | *) _linecomp_path="${_linecomp_path}/" ;; 29 | esac 30 | 31 | source "$_linecomp_path"readline_funcs.sh 32 | source "$_linecomp_path"completions.sh 33 | 34 | #trap "" INT SIGINT 35 | trap "history -a && echo linecomp exited" EXIT 36 | 37 | compose_case() { 38 | # This function composes the case statement used by linecomp for input 39 | # it does this by reading the current session keybinds and turning them into a 40 | # statement that can be used for the users input, therefore allowing for linecomp 41 | # to be a drop in replacement for the default line-editor 42 | local raw_binds 43 | 44 | raw_binds=$( 45 | bind -p | grep -a -v '^#' | tr "'\"" "\"'" 46 | ) 47 | 48 | linecomp_case=$( 49 | cat <<-'EOF' 50 | _key_done=false 51 | _temp="" 52 | while [[ $_key_done = false ]] 53 | do 54 | IFS= read -rsn1 -d '' _char 55 | _key_done=true 56 | _temp="$_temp$_char" 57 | case $_temp in 58 | EOF 59 | 60 | # Uncustomisables (EOF, Ctrl-c, etc) 61 | cat <<-'EOF' 62 | $'\004') [[ -z "$READLINE_LINE" ]] && exit ;; 63 | $'\cc') 64 | printf '%s\n' '^C' 65 | printf '\e7' 66 | _reading='false' 67 | echo -n "$(print_command_line)" ;; 68 | EOF 69 | raw_binds="${raw_binds/$'\n'}" 70 | raw_binds="${raw_binds//$'\n'/$'\n'\$}" 71 | raw_binds="${raw_binds//\\C-/\\c}" 72 | raw_binds="${raw_binds//: /) }" 73 | raw_binds="${raw_binds//$'\n'/ ;;$'\n'}" 74 | printf '%s\n' "$raw_binds ;;" 75 | 76 | printf '%s\n' '*) _key_done=false ;;' 77 | printf '%s\n' 'esac' 78 | printf '%s\n' '[[ ${#_temp} -gt 6 ]] && _temp=""' 79 | #printf '%s\n' 'echo $_temp' 80 | printf '%s\n' 'done' 81 | printf '%s\n' '_temp=' 82 | ) 83 | 84 | } 85 | 86 | # Not text 87 | 88 | history_get() { 89 | set -o history 90 | readarray -t _hist_array < <(history | awk '{$1=""; print $0}') 91 | HISTORY_POINT="${#_hist_array[@]}" 92 | } 93 | 94 | # Meta 95 | 96 | print_command_line() { 97 | local whole_line part_line 98 | 99 | whole_line="${READLINE_LINE//$'\n'/$'\n'${PS2@P}}" 100 | whole_line="${whole_line//$'\e'/^[}" 101 | 102 | part_line="${READLINE_LINE:0:$READLINE_POINT}" 103 | part_line="${part_line//$'\n'/$'\n'${PS2@P}}" 104 | part_line="${part_line//$'\e'/^[}" 105 | 106 | printf '\e8%s%s\e[%sm%s\e[0m\e[K\e8%s%s' \ 107 | "${PS1@P}" \ 108 | "$whole_line" \ 109 | "$_color" \ 110 | "${_post_prompt:${#READLINE_LINE}}" \ 111 | "${PS1@P}" \ 112 | "$part_line" 113 | } 114 | 115 | # Other 116 | 117 | main_func() { 118 | history_get 119 | HISTORY_POINT="${#_hist_array[@]}" 120 | READLINE_POINT=0 121 | _reading="true" 122 | _prompt="${PS1@P}" 123 | _PS2exp="${PS2@P}" 124 | READLINE_LINE='' 125 | _color='31' 126 | _post_prompt='' 127 | 128 | while [[ "$_reading" == "true" ]]; 129 | do 130 | set -o history 131 | echo -n "$(print_command_line)" 132 | eval -- "$linecomp_case" 133 | done 134 | } 135 | 136 | main_loop() { 137 | while true; 138 | do 139 | eval "$PROMPT_COMMAND" 140 | main_func 141 | done 142 | echo "$linecomp_case" 143 | } 144 | 145 | printf '\e7' 146 | echo -n "${PS1@P}" 147 | 148 | _commands=$(compgen -c | sort -u | awk '{ print length, $0 }' | sort -n -s | cut -d' ' -f2- ) 149 | 150 | 151 | _default_term_state="$(stty -g)" 152 | 153 | printf '\e[?2004h' # enable bracketed paste so we can handle rselves 154 | stty -echo 155 | stty intr '' 156 | shopt -s dotglob 157 | shopt -s nullglob 158 | _linecomp_term_state="$(stty -g)" 159 | 160 | compose_case 161 | main_loop 162 | stty "$_default_term_state" 163 | #echo "$linecomp_case" 164 | -------------------------------------------------------------------------------- /readline_funcs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Readline functions for linecomp 4 | 5 | #abort 6 | accept-line() { 7 | case "$READLINE_LINE" in 8 | *"EOM"*"EOM"*|*"EOF"*"EOF"*) _reading=false ;; 9 | *"\'"|*"EOM"*|*"EOF"*) READLINE_LINE+=$'\n' 10 | ((READLINE_POINT+=1)) ;; 11 | *) 12 | if [[ $(bash -nc "$READLINE_LINE" 2>&1) == *'unexpected end of file'* ]]; 13 | then 14 | READLINE_LINE+=$'\n' 15 | ((READLINE_POINT+=1)) 16 | else 17 | printf '\e8\e[K%s%s\n' "$_prompt" "${READLINE_LINE//$'\n'/$'\e[K\n >'}" 18 | if [[ -n "$READLINE_LINE" ]]; 19 | then 20 | history -s "$READLINE_LINE" 21 | fi 22 | stty "$_default_term_state" 23 | eval "$READLINE_LINE" # This continues to be bad 24 | stty "$_linecomp_term_state" 25 | printf '\e7' 26 | _reading=false 27 | [[ "$READLINE_LINE" == *'bind'* ]] && compose_case # Recreate the case statement if the command has bind 28 | fi ;; 29 | esac 30 | } 31 | #alias-expand-line 32 | #arrow-key-prefix 33 | #backward-byte 34 | backward-char() { 35 | if [[ $READLINE_POINT -gt 0 ]]; 36 | then 37 | ((READLINE_POINT-=1)) 38 | fi 39 | } 40 | backward-delete-char() { 41 | if [[ $READLINE_POINT -gt 0 ]]; 42 | then 43 | READLINE_LINE="${READLINE_LINE:0:$((READLINE_POINT-1))}${READLINE_LINE:$READLINE_POINT}" 44 | ((READLINE_POINT-=1)) 45 | fi 46 | } 47 | #backward-kill-line 48 | #backward-kill-word 49 | backward-word() { 50 | _temp="${READLINE_LINE:0:$READLINE_POINT}" 51 | _temp="${_temp%[^[:alnum:]]*}" 52 | if ! [[ "$_temp" == *' '* ]]; 53 | then 54 | READLINE_POINT=0 55 | else 56 | READLINE_POINT=${#_temp} 57 | fi 58 | } 59 | #beginning-of-history 60 | beginning-of-line() { 61 | READLINE_POINT=0 62 | } 63 | bracketed-paste-begin() { 64 | _temp='' 65 | until [[ "$_temp" == *$'\e[201~' ]] 66 | do 67 | IFS= read -rsn1 -t 0.01 _char 68 | _temp+="$_char" 69 | done 70 | _temp="${_temp:0:-6}" 71 | READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$_temp${READLINE_LINE:$READLINE_POINT}" 72 | ((READLINE_POINT+="${#_temp}")) 73 | } 74 | #call-last-kbd-macro 75 | #capitalize-word 76 | #character-search 77 | #character-search-backward 78 | #clear-display 79 | clear-screen() { 80 | clear 81 | printf '\e7' 82 | } 83 | complete() { 84 | if [[ ${#_post_prompt} -gt ${#READLINE_LINE} ]]; 85 | then 86 | READLINE_LINE="$_post_prompt" 87 | READLINE_POINT=${#READLINE_LINE} 88 | fi 89 | } 90 | #complete-command 91 | #complete-filename 92 | #complete-hostname 93 | #complete-into-braces 94 | #complete-username 95 | #complete-variable 96 | #copy-backward-word 97 | #copy-forward-word 98 | #copy-region-as-kill 99 | #dabbrev-expand 100 | delete-char() { 101 | READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${READLINE_LINE:$((READLINE_POINT+1))}" 102 | } 103 | #delete-char-or-list 104 | #delete-horizontal-space 105 | #digit-argument 106 | #display-shell-version 107 | #do-lowercase-version 108 | #downcase-word 109 | #dump-functions 110 | #dump-macros 111 | #dump-variables 112 | #dynamic-complete-history 113 | #edit-and-execute-command 114 | #emacs-editing-mode 115 | #end-kbd-macro 116 | #end-of-history 117 | end-of-line() { 118 | READLINE_POINT=${#READLINE_LINE} 119 | } 120 | #exchange-point-and-mark 121 | #fetch-history 122 | #forward-backward-delete-char 123 | #forward-byte 124 | forward-char() { 125 | if [[ $READLINE_POINT -lt ${#READLINE_LINE} ]]; 126 | then 127 | ((READLINE_POINT+=1)) 128 | fi 129 | } 130 | #forward-search-history 131 | forward-word() { 132 | _temp="${READLINE_LINE:$(( READLINE_POINT + 1 ))} " 133 | _temp="${_temp#*[^[:alnum:]]}" 134 | READLINE_POINT="$(( ${#READLINE_LINE} - ${#_temp} ))" 135 | } 136 | #glob-complete-word 137 | #glob-expand-word 138 | #glob-list-expansions 139 | #history-and-alias-expand-line 140 | #history-expand-line 141 | #history-search-backward 142 | #history-search-forward 143 | #history-substring-search-backward 144 | #history-substring-search-forward 145 | #insert-comment 146 | #insert-completions 147 | #insert-last-argument 148 | kill-line() { 149 | READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}" 150 | } 151 | #kill-region 152 | #kill-whole-line 153 | kill-word() { 154 | READLINE_LINE="${READLINE_LINE% *}" 155 | } 156 | #magic-space 157 | #menu-complete 158 | #menu-complete-backward 159 | next-history() { 160 | ((HISTORY_POINT+=1)) 161 | if [[ $HISTORY_POINT -gt ${#_hist_array[@]} ]]; 162 | then 163 | HISTORY_POINT="${#_hist_array[@]}" 164 | fi 165 | if [[ "$READLINE_LINE" != *$'\n'* ]] 166 | then 167 | READLINE_LINE="${_hist_array[$HISTORY_POINT]}" 168 | READLINE_POINT=${#READLINE_LINE} 169 | fi 170 | } 171 | #next-screen-line 172 | #non-incremental-forward-search-history 173 | #non-incremental-forward-search-history-again 174 | #non-incremental-reverse-search-history 175 | #non-incremental-reverse-search-history-again 176 | #old-menu-complete 177 | #operate-and-get-next 178 | #overwrite-mode 179 | #possible-command-completions 180 | #possible-completions 181 | #possible-filename-completions 182 | #possible-hostname-completions 183 | #possible-username-completions 184 | #possible-variable-completions 185 | previous-history() { 186 | ((HISTORY_POINT-=1)) 187 | if [[ $HISTORY_POINT -le 0 ]]; then HISTORY_POINT=0; fi 188 | if [[ "$READLINE_LINE" != *$'\n'* ]] 189 | then 190 | READLINE_LINE="${_hist_array[$HISTORY_POINT]}" 191 | READLINE_POINT=${#READLINE_LINE} 192 | fi 193 | } 194 | #previous-screen-line 195 | #print-last-kbd-macro 196 | quoted-insert() { 197 | read -rsn1 _char 198 | read -rsn5 -t 0.005 _temp 199 | _char="$_char$_temp" 200 | READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$_char${READLINE_LINE:$READLINE_POINT}" 201 | ((READLINE_POINT+=${#_char})) 202 | } 203 | #re-read-init-file 204 | #redraw-current-line 205 | #reverse-search-history 206 | #revert-line 207 | self-insert() { 208 | READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$_char${READLINE_LINE:$READLINE_POINT}" 209 | ((READLINE_POINT+=1)) 210 | comp_complete 211 | } 212 | #set-mark 213 | #shell-backward-kill-word 214 | #shell-backward-word 215 | #shell-expand-line 216 | #shell-forward-word 217 | #shell-kill-word 218 | #shell-transpose-words 219 | #skip-csi-sequence 220 | #spell-correct-word 221 | #start-kbd-macro 222 | #tab-insert 223 | tilde-expand() { 224 | if [[ "${READLINE_LINE:$READLINE_POINT:1}" == '~' ]]; 225 | then 226 | READLINE_LINE="${READLINE_LINE:0:$((READLINE_POINT))}$HOME${READLINE_LINE:$((READLINE_POINT+1))}" 227 | ((READLINE_POINT+=${#HOME})) 228 | elif [[ "${READLINE_LINE:$((READLINE_POINT-1)):1}" == '~' ]]; 229 | then 230 | READLINE_LINE="${READLINE_LINE:0:$((READLINE_POINT-1))}$HOME${READLINE_LINE:$((READLINE_POINT))}" 231 | ((READLINE_POINT+=${#HOME})) 232 | fi 233 | } 234 | #transpose-chars 235 | #transpose-words 236 | #tty-status 237 | #undo 238 | #universal-argument 239 | #unix-filename-rubout 240 | #unix-line-discard 241 | #unix-word-rubout 242 | #upcase-word 243 | #vi-append-eol 244 | #vi-append-mode 245 | #vi-arg-digit 246 | #vi-bWord 247 | #vi-back-to-indent 248 | #vi-backward-bigword 249 | #vi-backward-word 250 | #vi-bword 251 | #vi-change-case 252 | #vi-change-char 253 | #vi-change-to 254 | #vi-char-search 255 | #vi-column 256 | #vi-complete 257 | #vi-delete 258 | #vi-delete-to 259 | #vi-eWord 260 | #vi-edit-and-execute-command 261 | #vi-editing-mode 262 | #vi-end-bigword 263 | #vi-end-word 264 | #vi-eof-maybe 265 | #vi-eword 266 | #vi-fWord 267 | #vi-fetch-history 268 | #vi-first-print 269 | #vi-forward-bigword 270 | #vi-forward-word 271 | #vi-fword 272 | #vi-goto-mark 273 | #vi-insert-beg 274 | #vi-insertion-mode 275 | #vi-match 276 | #vi-movement-mode 277 | #vi-next-word 278 | #vi-overstrike 279 | #vi-overstrike-delete 280 | #vi-prev-word 281 | #vi-put 282 | #vi-redo 283 | #vi-replace 284 | #vi-rubout 285 | #vi-search 286 | #vi-search-again 287 | #vi-set-mark 288 | #vi-subst 289 | #vi-tilde-expand 290 | #vi-undo 291 | #vi-unix-word-rubout 292 | #vi-yank-arg 293 | #vi-yank-pop 294 | #vi-yank-to 295 | #yank 296 | #yank-last-arg 297 | #yank-nth-arg 298 | #yank-pop 299 | -------------------------------------------------------------------------------- /remaining_commands.md: -------------------------------------------------------------------------------- 1 | abort 2 | accept-line 3 | alias-expand-line 4 | arrow-key-prefix 5 | backward-byte 6 | ~~ backward-char ~~ 7 | ~~ backward-delete-char ~~ 8 | backward-kill-line 9 | backward-kill-word 10 | ~~ backward-word ~~ 11 | beginning-of-history 12 | ~~ beginning-of-line ~~ 13 | ~~ bracketed-paste-begin ~~ 14 | call-last-kbd-macro 15 | capitalize-word 16 | character-search 17 | character-search-backward 18 | clear-display 19 | clear-screen 20 | ~~ complete ~~ 21 | complete-command 22 | complete-filename 23 | complete-hostname 24 | complete-into-braces 25 | complete-username 26 | complete-variable 27 | copy-backward-word 28 | copy-forward-word 29 | copy-region-as-kill 30 | dabbrev-expand 31 | ~~ delete-char ~~ 32 | delete-char-or-list 33 | delete-horizontal-space 34 | digit-argument 35 | display-shell-version 36 | do-lowercase-version 37 | downcase-word 38 | dump-functions 39 | dump-macros 40 | dump-variables 41 | dynamic-complete-history 42 | edit-and-execute-command 43 | emacs-editing-mode 44 | end-kbd-macro 45 | end-of-history 46 | ~~ end-of-line ~~ 47 | exchange-point-and-mark 48 | forward-backward-delete-char 49 | forward-byte 50 | ~~ forward-char ~~ 51 | forward-search-history 52 | ~~ forward-word ~~ 53 | glob-complete-word 54 | glob-expand-word 55 | glob-list-expansions 56 | history-and-alias-expand-line 57 | history-expand-line 58 | history-search-backward 59 | history-search-forward 60 | history-substring-search-backward 61 | history-substring-search-forward 62 | insert-comment 63 | insert-completions 64 | insert-last-argument 65 | ~~ kill-line ~~ 66 | kill-region 67 | kill-whole-line 68 | ~~ kill-word ~~ 69 | magic-space 70 | menu-complete 71 | menu-complete-backward 72 | ~~ next-history ~~ 73 | next-screen-line 74 | non-incremental-forward-search-history 75 | non-incremental-forward-search-history-again 76 | non-incremental-reverse-search-history 77 | non-incremental-reverse-search-history-again 78 | old-menu-complete 79 | operate-and-get-next 80 | overwrite-mode 81 | possible-command-completions 82 | possible-completions 83 | possible-filename-completions 84 | possible-hostname-completions 85 | possible-username-completions 86 | possible-variable-completions 87 | ~~ previous-history ~~ 88 | previous-screen-line 89 | print-last-kbd-macro 90 | ~~ quoted-insert ~~ 91 | re-read-init-file 92 | redraw-current-line 93 | reverse-search-history 94 | revert-line 95 | ~~ self-insert ~~ 96 | set-mark 97 | shell-backward-kill-word 98 | shell-backward-word 99 | shell-expand-line 100 | shell-forward-word 101 | shell-kill-word 102 | shell-transpose-words 103 | skip-csi-sequence 104 | start-kbd-macro 105 | tab-insert 106 | ~~ tilde-expand ~~ 107 | transpose-chars 108 | transpose-words 109 | tty-status 110 | undo 111 | universal-argument 112 | unix-filename-rubout 113 | unix-line-discard 114 | unix-word-rubout 115 | upcase-word 116 | vi-append-eol 117 | vi-append-mode 118 | vi-arg-digit 119 | vi-bWord 120 | vi-back-to-indent 121 | vi-backward-bigword 122 | vi-backward-word 123 | vi-bword 124 | vi-change-case 125 | vi-change-char 126 | vi-change-to 127 | vi-char-search 128 | vi-column 129 | vi-complete 130 | vi-delete 131 | vi-delete-to 132 | vi-eWord 133 | vi-editing-mode 134 | vi-end-bigword 135 | vi-end-word 136 | vi-eof-maybe 137 | vi-eword 138 | vi-fWord 139 | vi-fetch-history 140 | vi-first-print 141 | vi-forward-bigword 142 | vi-forward-word 143 | vi-fword 144 | vi-goto-mark 145 | vi-insert-beg 146 | vi-insertion-mode 147 | vi-match 148 | vi-movement-mode 149 | vi-next-word 150 | vi-overstrike 151 | vi-overstrike-delete 152 | vi-prev-word 153 | vi-put 154 | vi-redo 155 | vi-replace 156 | vi-rubout 157 | vi-search 158 | vi-search-again 159 | vi-set-mark 160 | vi-subst 161 | vi-tilde-expand 162 | vi-unix-word-rubout 163 | vi-yank-arg 164 | vi-yank-pop 165 | vi-yank-to 166 | yank 167 | yank-last-arg 168 | yank-nth-arg 169 | yank-pop 170 | --------------------------------------------------------------------------------