Таким образом, основная проблема с вашей командой заключается в том, что, используя |
, вы на самом деле разбиваете ее на несколько команд, первая из которых — nnoremap
, а начиная со второй — последовательность команд silent!
с замены, которые выполняются во время получения вашего .vimrc
, а не становятся частью команды.
Использование \|
или <bar>
должно решить эту проблему.
Вторая проблема заключается в том, что nnoremap
ожидает команду в обычном режиме, поэтому он берет ваш silent!
и запускает командуs
(замены ), которая затем заменяет символ под курсором на ilent!...
, это не то, что вам нужно... Вам нужен дополнительный :
перед первым silent!
, чтобы он знал, что нужно перейти в командный режим.
И в-третьих, ваша последняя команда %s/;$<CR>
не очень хорошо сформирована, вам нужны две дополнительные /
для ее завершения. Я предполагаю, что вы намерены удалить все ;
в конце строк,так что %s/;$//
это то, что я предполагаю, что вы хотите здесь. (Я также заметил, что вы пропустили здесь silent!
, может быть, по недосмотру? Добавляю сюда, на всякий случай.)
Собираем все воедино:
nnoremap ;; :silent! :%s/\s\+$//e \| silent! :%s/\(\n\n\)\n\+/\1/ \| silent! :%s#\($\n\s*\)\+\%$## \| silent! :%s/;$//<CR>
Я нашел ответ.
Как видно из приведенных ниже выдержек из исходного кода ядра, если какой-либо из флагов NODEV, NOSUID, NOEXEC и/или ATIME уже установлен, мне нужно будет сохранить (, т. е. продолжить установку ). ] их во время моего второго звонка на mount()
.
Из fs/namespace.c
исходного кода ядра Linux:
/*
* Handle reconfiguration of the mountpoint only without alteration of the
* superblock it refers to. This is triggered by specifying MS_REMOUNT|MS_BIND
* to mount(2).
*/
static int do_reconfigure_mnt(struct path *path, unsigned int mnt_flags)
{
struct super_block *sb = path->mnt->mnt_sb;
struct mount *mnt = real_mount(path->mnt);
int ret;
if (!check_mnt(mnt))
return -EINVAL;
if (path->dentry != mnt->mnt.mnt_root)
return -EINVAL;
if (!can_change_locked_flags(mnt, mnt_flags))
return -EPERM;
down_write(&sb->s_umount);
ret = change_mount_ro_state(mnt, mnt_flags);
if (ret == 0)
set_mount_attributes(mnt, mnt_flags);
up_write(&sb->s_umount);
mnt_warn_timestamp_expiry(path, &mnt->mnt);
return ret;
}
static bool can_change_locked_flags(struct mount *mnt, unsigned int mnt_flags)
{
unsigned int fl = mnt->mnt.mnt_flags;
if ((fl & MNT_LOCK_READONLY) &&
!(mnt_flags & MNT_READONLY))
return false;
if ((fl & MNT_LOCK_NODEV) &&
!(mnt_flags & MNT_NODEV))
return false;
if ((fl & MNT_LOCK_NOSUID) &&
!(mnt_flags & MNT_NOSUID))
return false;
if ((fl & MNT_LOCK_NOEXEC) &&
!(mnt_flags & MNT_NOEXEC))
return false;
if ((fl & MNT_LOCK_ATIME) &&
((fl & MNT_ATIME_MASK) != (mnt_flags & MNT_ATIME_MASK)))
return false;
return true;
}