Использование оператора if для выполнения другой команды на основе значения глобальной переменной - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу выполнить :set winminheight=1<cr>^W=^W_, если значение переменной winminheight равно 0. иначе я хочу запустить :set winminheight=0<cr>^W_

Я попробовал ниже сценарий сопоставления, чтобы выполнить sh, но это не работает. Я тоже не получаю ошибки.

nnoremap <silent>  <leader>0 
\ : if (&g:winminheight ==0) <BAR>
\   execute "normal! :set winminheight=1""\<lt>cr>^W=^W_" <BAR>
\ else <BAR>
\   execute "normal! :set winminheight=0""\<lt>cr>^W_" <BAR>
\ endif <CR>

Когда я вызываю отображение, оно вообще не отвечает. Пожалуйста, помогите мне исправить это.

1 Ответ

2 голосов
/ 25 февраля 2020

Не уверен, что я точно следую тому, что вы пытаетесь сделать ...

Но обратите внимание на некоторые моменты:

  • Вам не нужно :normal для запуска команда Ex, такая как set winminheight=0
  • Для команд Ctrl-W вы также можете использовать wincmd, что означает, что для них также можно использовать команды Ex.
  • Наконец, вам не нужны скобки вокруг условия в операторе if, и вам также не нужен g: ('winminheight' - это глобальная опция).

Собираем все вместе:

nnoremap <silent> <leader>0  
\ :if &winminheight == 0 <BAR>
\    set winminheight=1 <BAR>
\    wincmd = <BAR>
\    wincmd _ <BAR>
\ else <BAR>
\    set winminheight=0 <BAR>
\    wincmd _ <BAR>
\ endif <CR>

Я рекомендую сильно избегать использования :execute и :normal непосредственно из сопоставления ... Поскольку само сопоставление расширит ключ последовательностей, вы в конечном итоге получаете несколько уровней экранирования, и это действительно трудно сделать правильно.

Я действительно попытался отладить ваше отображение, и после нескольких попыток я нашел это решение, которое вы увидите, очень некрасиво:

execute "normal! :set winminheight=1\<lt>cr>\<lt>c-w>=\<lt>c-w>_" <BAR>

(Это только первый :execute, но вы получите картинку .)

Даже использование только команд Ex все еще сложно, так как вам нужны разделители <BAR>, которые не всегда хорошо работают с каждой командой ...

Гораздо лучше просто определить функцию и пусть отображение вызывает функцию (или использует отображение <expr>), тогда вам не нужно беспокоиться ни об одном из экранирования в теле функции. Гораздо проще!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...