13

Вопрос по bash, shell – Что делает «set keymap vi»?

Я хотел vim-подобную навигацию для моего терминала, поэтому я добавил:

set editing-mode vi
set keymap vi

К моему.inputrc файл на основеэтот. editing-mode vi добавляет навигацию vi. Что значитkeymap vi делай, а зачем мне это?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded"\ep"Error: User Rate Limit ExceededESC + pError: User Rate Limit Exceeded"\e[A"Error: User Rate Limit ExceededESC + [, SHIFT + a.

    от
  • Error: User Rate Limit Exceededno oneError: User Rate Limit Exceeded

    от
  • 9

    От

    man readline (мой акцент):

    The set of legal keymap names is emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command, and vi-insert. vi is equivalent to vi-command

    Таким образом, в вашемinputrc Вы можете указать разные комбинации клавиш для разных режимов, например, вcommand В режиме вы можете восстановить последний аргумент из предыдущей команды с помощьюAltp, но эта связка клавиш не будет иметь никакого эффекта вinsert режим (в любом случае в этой простой настройке):

    set editing-mode vi
    
    set keymap vi-command
    # these are for vi-command mode
    "\e[A": history-search-backward
    "\e[B": history-search-forward
    "\ep": yank-last-arg
    
    set keymap vi-insert
    # these are for vi-insert mode
    "\e[A": history-search-backward
    "\e[B": history-search-forward
    Control-l: clear-screen

  • 5

    TL;DR

    Если вы не хотите изменять / добавлять привязки в раскладках клавиш по умолчанию, вам не нужна строкаkeymap vi.

    Какиеkeymap vi означает, что любые привязки, перечисленные после этой точки, применяются к этой карте ключей (котораяexactly та же самая клавиатура, что иvi-command а такжеvi-move).

    Если вы хотите изменить раскладку клавиш вставки (например, чтобы добавитьCtrl-A привязка к началу строки, пока вы печатаете), вам нужно сделать это нижеkeymap vi-insert линия.

    Если вы хотите получить дополнительную информацию оvi режим и карты, перейдите к заголовкуediting-mode vi (последний).

    Но ждать! Тем не менее, имеется довольно много справочной информации, которая может потребоваться: например, разница междуediting-mode иkeymap.

    Особенно полезной является концепция гибридаemacs раскладка клавиатуры для вставки текста и при этом легко добраться доvi-command для внесения изменений.

    What is the difference between an editing-mode and a keymap?

    Естьonly дваediting-modes:emacs (по умолчанию) иvi.

    Документация библиотеки GNU Readline говорит:

    editing-mode
        The editing-mode variable controls which default set of key bindings is
        used. By default, Readline starts up in Emacs editing mode, where the
        keystrokes are most similar to Emacs. This variable can be set to either
        `emacs' or `vi'.
    

    Обратите внимание на разницу междуediting-mode а такжеkeymap: Вediting-mode vi две (да, только две, читайте дальше) раскладки клавиш включаются и выключаются для эмуляции различных режимовvi редактор.ALL emacs те, которые работают одновременно вediting-mode emacs (объяснено позже).

    Так что жеediting-mode на самом деле делать? Он просто устанавливает активную раскладку клавиатуры при запуске оболочки наemacs или жеvi-insert.

    What are the unique keymaps?

    Acceptable keymap names are emacs, emacs-standard, emacs-meta, emacs-ctlx,
    vi, vi-move, vi-command, and vi-insert.
    
    vi is equivalent to vi-command; emacs is equivalent to emacs-standard.
    

    Пока не задокументировано,vi/vi-command а такжеvi-move раскладки клавиш также эквивалентны:

    [email protected]:~$ diff <(bind -pm vi) <(bind -pm vi-move)
    [email protected]:~$ 
    

    Это оставляет нас с:emacs, emacs-meta, emacs-ctlx, vi, а такжеvi-insert как уникальные раскладки клавиш для объяснения. Дифференцировать раскладки клавиш, вероятно, лучше всего, проверив их ...

    What are the keymaps default bindings?

    Чтобы просмотреть привязки по умолчанию для (например) emacs (по умолчанию), используйте:

    INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -v '^#
    

    Вы можете заменитьemacs с любым другим именем карты ключей в примере выше.

    Есть много строк, говорящихself-insert или жеdo-lowercase-version которые не очень полезны, поэтому удалите их:

    INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$' | sort
    

    What is the difference between the various emacs keymaps?

    TL; DR: это разные представления об одном наборе отображений, примененных кediting-mode emacs.

    Если вы выводите вторую команду в файлы с именемemacs-standard, emacs-meta, emacs-ctlx, vi-command, а такжеvi-insert для их соответствующегоkeymaps, вы можете узнать, что:

    НЕТ команд, отображенных вemacs-meta а такжеemacs-ctlx которые также не отображаются вemacs-standard:

    $ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-ctlx|sort)
    $ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-meta|sort)
    $
    

    Такemacs/emacs-standard является функционально-функциональным надмножеством обоихemacs-ctlx а такжеemacs-meta Это означает, что:

    keymap emacs
    "\eg": glob-expand-word
    "\C-x\C-r": re-read-init-file
    

    Функционально эквивалентно:

    keymap emacs-meta
    "g": glob-expand-word
    
    keymap emacs-ctlx
    "\C-r": re-read-init-file
    

    Вы можете утверждать, что вторую форму легче читать.

    Inserting text: emacs vs vi-insert

    Есть 28 команд вemacs-standard не вvi-insert

    [email protected]:~/lib/readline$ comm -12 vi-insert emacs-standard |wc -l
    28
    [email protected]:~/lib/readline$
    

    emacs/emacs-standard в основном надмножествоvi-insert, Поэтому для ввода текста лучше всего использоватьemacs-standard раскладка надvi-insert пока ты можешьлегко переключаться междуemacs and vi-command.

    Единственные дополнительные привязки вvi-insert не вemacs-standard являются:

    [email protected]:~/lib/readline$ comm -23 vi-insert emacs-standard 
    "\C-d": vi-eof-maybe
    "\C-n": menu-complete
    "\C-p": menu-complete-backward
    "\e": vi-movement-mode
    

    Первые 3 из этих четырех конфликтуют сemacs привязок:

    "\C-d": delete-char
    "\C-n": next-history
    "\C-p": previous-history
    

    который я решил следующим образом:

    set keymap emacs
    "\e": "kj" # see https://unix.stackexchange.com/questions/303631/how-can-i-setup-a-hybrid-readline-with-emacs-insert-mode-and-vi-command-mode
    "\C-d": delete-char # eof-maybe: ^D does nothing if there is text on the line
    "\C-n": menu-complete
    "\C-p": menu-complete-backward
    "\C-y": previous-history # historY
    "\e\C-y": previous-history
    
    editing-mode vi

    Как мы видели выше,vi, vi-command а такжеvi-move являютсяone and the same раскладка:

    [email protected]:~$ diff <(bind -pm vi) <(bind -pm vi-move)
    [email protected]:~$ 
    

    Обратите внимание, что всегоtwo отдельные карты, которые по умолчанию связаны сediting-mode vi.

    Когда вediting-mode vi,keymaps используютсяvi/vi-command/vi-move а такжеvi-insert (стартовая таблица ключей). Только одна из этих двух карт активна одновременно.

    editing-mode vi ничего не делает, кроме как установить раскладку по умолчанию при запуске оболочки, помеченнуюvi-insert, Опять же, одновременно активна только одна раскладка клавиш. этоvi-insert раскладка клавиш сопоставляет большинство ключей сself-insert поэтому, когда вы нажимаете пластиковую кнопку на клавиатуре, на экране появляется символ, напечатанный на ней.

    vi-insert раскладка клавиатуры позволяет переключаться на раскладку текста, которая называетсяvi-command/vi/vi-move используяvi-movement-mode команда, связанная сESC ключ по умолчанию вvi-insert раскладка.

    На самом деле, дажеemacs раскладка клавиатуры может установитьviклавиатура, похожая на текстовую манипуляциюvi-movement-mode команда, как в гибридном решении, упомянутом выше.

    Or in easier language...

    По умолчанию нажмитеESC перейти наvi-command раскладка клавиатуры, когдаvi-insert Карта ключей активна.

    vi-command В раскладке используются стандартные одиночные нажатия клавиш, такие какa, b а такжеc перемещаться и взаимодействовать с текстом, какvi редактор по умолчанию или командный режим. Там вообще нетCtrl+key комбинации. Вы не можете вставлять текст в этом режиме; буквенные клавиши отображаются на команды редактирования / перемещения. Для ввода текста вы переключаетесь наvi-insert раскладка клавиатуры (пример: нажмитеi для & quot; Вставить & quot;).

    Ввод текста осуществляется с помощьюvi-insert раскладка клавиатуры, которая активна при запуске оболочки, если у вас естьediting-mode vi в вашем.inputrc файл. Своп кvi-insert раскладка клавиш нажатиемi для & quot; вставить & quot; пока вvi-command (или многими другими способами дляvi).

    Если вы не знаетеvi редактор, вы, вероятно, найдетеvi-command поначалу клавиши очень сложны в использовании, но если вы хорошо разбираетесь в них, вы можете редактировать текст как длиннобородый волшебник.