Если Вы знаете о какой-либо команде, скажем, ls
, Вы вводите его и затем поражаете возврат, оболочка будет знать, где та программа (ls), вызовите его и покажите Вам результат. Это - использование оболочки "несценария".
Но, если Вы заказываете несколько таких команд в последовательности, скажем A, B, C, D, и затем помещаете его (последовательность) в исполняемом файле, у Вас есть программа. Программа имеет название и местоположение, таким образом, на нее можно сослаться и вызвать; это имеет код, таким образом, это может быть выполнено, одна команда за один раз, ЦП.
(Программа не компилируется - как, например, C источник был бы - и это делает это сценарием. Но это - программа, тем не менее.)
Таким образом, в некотором аспекте уже в этой точке Вы программируете, потому что Вы сообщаете компьютеру, что сделать.
Кроме того, Вы, снова на очень простом уровне, также с помощью языка программирования, потому что Вы ничего не можете просто ввести (и ожидать, что это будет работать); одновременно, независимо от того, что Вы вводите, Вы получите действие от компьютера, который соответствует точно тому, что Вы записали.
Существуют правила, как необходимо сказать вещи, и существуют правила, как компьютер будет реагировать на те вещи.
Тем не менее с "программированием", Вы обычно связываете несколько более выразительное питание, чем просто укладка команд друг на друге. По крайней мере требуется перейти (if ... then ... else
), повторение (циклы: while
, for
, и т.д.), и вероятно некоторые другие вещи также. Но это в порядке, поскольку языки сценариев имеют те вещи и т.д.
Оболочки имеют различные языки, да, но некоторые могут наложиться в значительной степени из-за конвенции (почему изменение хороший способ сказать что-то?), или быть совместимым с более ранними версиями (или некоторый стандарт).
Bash явно отключает это и несколько других ярлыков Readline. Посмотрите initialize_readline()
функция в исходном коде удара (http://www.catonmat.net/download/bashline.c):
/* In Bash, the user can switch editing modes with "set -o [vi emacs]",
so it is not necessary to allow C-M-j for context switching. Turn
off this occasionally confusing behaviour. */
rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
#if defined (VI_MODE)
rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);
#endif
Я, кажется, не могу переопределить это поведение с помощью конфигурационного файла Readline (.inputrc).
Я подтвердил бы, что клавиатура, отображающая Meta+Control+j, на самом деле корректна в Вашей системе. Можно использовать эту команду для списка всего keybinds для различных режимов Bash. В моей системе также не было привязки клавиш.
$ bind -P| grep edit
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
vi-editing-mode is not bound to any keys
Можно сделать следующее так, чтобы при вводе Esc+e, он переключился между этими 2 режимами.
$ set -o emacs
$ bind '"\ee": vi-editing-mode'
$ set -o vi
$ bind '"\ee": emacs-editing-mode'
bind
управляйте теперь показывает это:
в vi режиме
$ bind -P |grep edit
edit-and-execute-command is not bound to any keys
emacs-editing-mode can be found on "\ee".
vi-editing-mode is not bound to any keys
в emacs режиме
$ bind -P |grep edit
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
vi-editing-mode can be found on "\ee".
Теперь можно использовать Esc+e для переключения между 2 различными режимами.
ESC E
. Если Вы приостановитесь, то Вы пойдете от vi-insert до vi-командного-режима или просто отмените текущую команду vi.
– spelufo
20.02.2015, 05:05
Вот то, что я оказался для моего ~ / .inputrc
, основанном на ответе SLM.
set show-mode-in-prompt on
set keymap emacs
"\ea": vi-editing-mode
set keymap vi-command
"k": history-search-backward
"j": history-search-forward
"z": emacs-editing-mode
"\ea": emacs-editing-mode
set keymap vi-insert
"\ea": emacs-editing-mode
"\C-l": clear-screen
"\C-e": end-of-line
"\C-k": kill-line
set editing-mode vi
Я попробовал MODE $ IF =
синтаксис, но я думаю, что это разрешено статически (один раз, когда читает файл), поэтому он не работает, как я ожидал. Таким образом, нам нужно переключаться на каждый keymap и измените его привязки ключей, даже если ранее устанавливаются на другие keymaps. В конце я говорю, какой режим я хочу начать с.
Я пытался использовать сопоставления в стиле emacs в режиме vi. В итоге я получил:
set keymap vi-command
"k": history-search-backward
"j": history-search-forward
set keymap vi-insert
"\C-A": beginning-of-line
"\C-B": backward-char
"\C-D": delete-char
"\C-E": end-of-line
"\C-F": forward-char
"\C-K": kill-line
"\C-L": clear-screen
"\C-N": next-history
"\C-P": previous-history
"\C-O": operate-and-get-next
# Enable Readline not waiting for additional input when a key is pressed.
# Needed for the mappings below.
set keyseq-timeout 0
# `yank-last-arg` does not work exactly as in emacs mode
"\e.": yank-last-arg
"\e\177": backward-kill-word
"\e0": digit-argument
"\e1": digit-argument
"\e2": digit-argument
"\e3": digit-argument
"\e4": digit-argument
"\e5": digit-argument
"\e6": digit-argument
"\e7": digit-argument
"\e8": digit-argument
"\e9": digit-argument
"\eb": backward-word
"\ec": capitalize-word
"\ed": kill-word
"\ef": forward-word
"\el": downcase-word
"\en": non-incremental-forward-search-history
"\ep": non-incremental-reverse-search-history
"\et": transpose-words
"\eu": upcase-word
"\ey": yank-pop
# some other useful mappings
"\e/": complete-filename
"\ek": kill-whole-line
"\eo": "\C-v\C-j"
# quickly switch to "normal" mode
"\C-[": vi-movement-mode
# perserve the currently editing line so that we can
# do something else before restoring it.
"\eg": insert-comment
"\er": "\C-R#\C-A\C-D\C-E"
set editing-mode vi
Полезно прочитать справочную страницу для readline
и
раздел READLINE
на bash
справочная страница.