(т.е. требуется fsck
). Несогласованность файловой системы не требуется.
Да, разблокировка произойдет после отмены связи. Но этот процесс нельзя будет прервать.
__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). Я ожидаю, что время обновления растровых изображений будет таким же, но они намного компактнее, чем указатели блоков.
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
действительно поддерживает 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
поддерживает readline
bind
. Я считаю, что bash
может быть скомпилирован без readilne
, поэтому могут быть некоторые редкие системы с bash, которые не поддерживают bind
(будьте бдительны). Чтобы сопоставить jk
с
в bash
, нужно сделать:
set -o vi
bind '"jk":"\e"'
(да, это двойной уровень цитирования, он необходим)
Опять же, это делает ввод j
довольно раздражающим. Но почему-то менее раздражающим, чем решение 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
не будут видеть карту.
Ссылки и дополнительное чтение:
Спасибо, за предыдущие ответы, я использую это в моем~/.zshrc для vi -как ярлыки в моем терминале. Я надеюсь, что это поможет кому-то.
bindkey -v
bindkey 'jk' vi-cmd-mode