В режиме bash vi сопоставьте jk для выхода из режима вставки

(т.е. требуется fsck ). Несогласованность файловой системы не требуется.

Да, разблокировка произойдет после отмены связи. Но этот процесс нельзя будет прервать.

ext2_evict_inode ->

__ext2_truncate_blocks ->
ext2_free_branches -> (for loop)
sb_bread ->
wait_on_buffer ->

wait_on_bit_io (& bh-> b_state, BH_Lock, TASK_UNINTERRUPTIBLE);

Выше пример для ext2 , я подумал, что будет проще посмотреть. ext3 ничем не отличается ...

ext4 должен быть быстрее. Использование экстентов должно избегать необходимости в тройных косвенных блоках . (В статье описывается добавление экстентов в ext3, но Линус возмутился и сказал, что сначала нужно перенести номер версии на ext4). Я ожидаю, что время обновления растровых изображений будет таким же, но они намного компактнее, чем указатели блоков.

11
23.05.2017, 15:39
2 ответа

TL;DR

Bash имеет функциональность, аналогичную zsh's bindkey через bind, но не имеет нескольких vi режимов, как zsh. После set -o vi вы можете сделать:

bind '"jk":vi-movement-mode'

что эквивалентно zsh's bindkey -M <все режимы vi> jk vi-movement-mode

Функции vi-movement-mode приходят из inputrc (их список см. в /etc/inputrc).

Полный текст

Как указывает Стивен Харрис в своем комментарии:

  • .bashrc вызывается bash всегда (и не вызывается другими оболочками).

  • .bash_profile вызывается только оболочками для входа в систему (и опять же, только bash).

Некоторые дистрибутивы поставляются со скелетом .bash_profile, который выглядит следующим образом:

# ~/.bash_profile
[[ -f ~/.bashrc ]] && . ~/.bashrc

Что является хорошим содержанием для .bash_profile, поскольку вы можете просто забыть о его существовании.

Теперь, чтобы сопоставить jk с Esc в сессии shell, это не совсем возможно. Когда вы это делаете:

inoremap jk <esc>

В Vim, после того как вы набрали j, Vim знает, что ему нужно немного подождать, чтобы увидеть, набрали ли вы k следующим, и он должен вызвать отображение (или что вы набрали другую клавишу, и отображение не должно быть вызвано). В качестве дополнения, это контролируется :set timeoutlen= в Vim (см. :h timeoutlen).

Некоторые оболочки или X11 не имеют такого контроля таймаута и не допускают отображения нескольких символов. Разрешено только отображение одной клавиши (но см. примечания поддержки ниже).

set -o vi

Не читает .vimrc, он только имитирует некоторые vi (даже не vim) комбинации клавиш, которые могут использоваться в оболочке. То же самое можно сказать о -o emacs, он не поставляется с полной мощностью emacs.


zsh support

zsh действительно поддерживает map timeout. И вы можете использовать следующее для отображения jk на :

bindkey -v  # instead of set -o vi
bindkey -e jk \\e

(Это нужно сделать в ~/.zshrc, а не в ~/.bashrc)

Тем не менее, я не советую этого делать. Большую часть времени я использую vim и zsh. У меня inoremap jk в vimrc, и я попробовал использовать вышеуказанную комбинацию bindkey. zsh слишком долго ждет печати j при его использовании, и это меня сильно раздражало.


bash support

bash поддерживает readline bind. Я считаю, что bash может быть скомпилирован без readilne, поэтому могут быть некоторые редкие системы с bash, которые не поддерживают bind (будьте бдительны). Чтобы сопоставить jk с в bash, нужно сделать:

set -o vi
bind '"jk":"\e"'

(да, это двойной уровень цитирования, он необходим)

Опять же, это делает ввод j довольно раздражающим. Но почему-то менее раздражающим, чем решение zsh на моей машине (возможно, таймаут по умолчанию короче).


Обходной путь (для не-bash и не zsh оболочек)

Причина переадресации клавиши Esc в том, что она находится довольно далеко на клавиатуре, и ее ввод занимает время. Трюк, который можно позаимствовать у ребят из emacs, состоит в том, чтобы переназначить CapsLock, поскольку это бесполезная клавиша. emacs ребята переназначают ее на Ctrl, но мы переназначим ее на Esc.

Давайте используем xev -event keyboard для проверки кода клавиши CapsLock:

KeyPress event, serial 25, synthetic NO, window 0x1c00001,
    root 0x496, subw 0x0, time 8609026, (764,557), root:(765,576),
    state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

И для проверки функции Esc:

KeyPress event, serial 25, synthetic NO, window 0x1c00001,
    root 0x496, subw 0x0, time 9488531, (571,525), root:(572,544),
    state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
    XLookupString gives 1 bytes: (1b) "
    XmbLookupString gives 1 bytes: (1b) "
    XFilterEvent returns: False

Очень хорошо, CapsLock это код клавиши 66, а функция Esc называется "Escape". Теперь мы можем сделать:

# diable caps lock
xmodmap -e "remove lock = Caps_Lock"
# make an Esc key from the keycode 66
xmodmap -e "keycode 66 = Escape"

Вышеперечисленное должно выполняться в таком порядке. Теперь каждый раз, когда вы нажимаете CapsLock, он работает как Esc.


Сложность в том, где это установить. Файл ~/.Xmodmap с содержимым:

remove lock = Caps_Lock
keycode 66 = Escape

Должен соблюдаться большинством дистрибутивов (на самом деле менеджеров дисплеев, но я говорю про дистрибутивы для простоты), но я видел такие, которые не соблюдают несколько файлов ~/X*. Для таких дистрибутивов вы можете попробовать что-то вроде:

if [ "x" != "x$DISPLAY" ]; then
    xmodmap -e "remove lock = Caps_Lock"
    xmodmap -e "keycode 66 = Escape"
fi

В вашем .bashrc.

(Теоретически это лучше разместить в ~/.xinitrc, но если менеджер отображения не уважает .Xmodmap, то он точно не будет уважать ~/. xnintrc.)

Дополнительное замечание: Это только переназначает CapsLock на Esc в X11 сессии, поэтому карта будет работать только в терминальных эмуляторах. Реальные tty не будут видеть карту.

Ссылки и дополнительное чтение:

15
27.01.2020, 19:59

Спасибо, за предыдущие ответы, я использую это в моем~/.zshrc для vi -как ярлыки в моем терминале. Я надеюсь, что это поможет кому-то.

bindkey -v
bindkey 'jk' vi-cmd-mode
3
27.01.2020, 19:59

Теги

Похожие вопросы