Карта ключей VIM на основе ОС? - PullRequest
0 голосов
/ 28 апреля 2018

Фон


Я использую VIM как на MacOS, так и на Windows, только с одной настройкой vimrc

А вот одна из моих облегченных привязок клавиш:

map <leader>cmd:exec has("mac")==1? ':!open -a terminal' : ':!start cmd'

Задача


Однако, это не работает так, как я думал: нажмите <leader>cmd и без , нажав клавишу ввода, после чего появится cmd или терминал.

На самом деле происходит целая строка отображения

exec has("mac")==1? ':!open -a terminal' : ':!start cmd' просто появляется в режиме ex и ждет, пока я нажму клавишу ввода, чтобы запустить себя.

Насколько я знаю, если вы используете exe "your cmd string" в настройке ключа сопоставления, вам не нужно ставить <cr> после него, но почему, когда вы используете тройной оператор, он ведет себя по-другому?

Попробуйте


Так что я положил в строку, как

map <leader>cmd:exec has("mac")==1? ':!open -a terminal<cr>' : ':!start cmd<cr>'

vim говорит мне:

enter image description here

(Кроме того, я не могу понять, почему <cr> в `` следует экранировать, не правда ли, строка в `` остается первоначальным значением?)

Итак, я изменил следующее:

map <leader>cmd:exec has("mac")==1? ':!open -a terminal\<cr\>' : ':!start cmd\<cr\>'

Но он снова появляется в режиме ex.

Любые решения, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

В отличие от ответа @ romainl, вам не нужно динамически оценивать операционную систему во время выполнения отображения (операционная система вряд ли может измениться во время работы Vim; это статическая информация). Поэтому намного проще определить сопоставления условно:

if has("mac")
    nnoremap <leader>cmd :!open -a terminal<CR>
else
    nnoremap <leader>cmd :!start cmd<CR>
endif

Это позволяет вам избавиться от :execute, немного быстрее, и его намного легче расширять или настраивать. (Все остальные предупреждения о :noremap и пропущенном <CR> из ответа @ romainl по-прежнему применимы.)

0 голосов
/ 29 апреля 2018

Во-первых, давайте немного очистим вашу команду:

:nnoremap <leader>cmd :execute has("mac") ? "!open -a terminal" : "!start cmd"
  • nnoremap лучше, чем map, потому что он обеспечивает нерекурсивность и явно описывает режим, для которого он предназначен,
  • нет необходимости проверять значение has(),
  • сокращенные имена удобны для ввода в командной строке, но они бесполезны в сценарии,
  • : являются избыточными.

Но все это на самом деле не решит вашу проблему, а именно то, что у вас нет возврата каретки в конце вашего отображения:

:nnoremap <leader>cmd :execute has("mac") ? "!open -a terminal" : "!start cmd"<CR>

И вам все равно придется нажимать <CR> второй раз, чтобы вернуться к Vim, так что ...

:nnoremap <leader>cmd :execute has("mac") ? "!open -a terminal" : "!start cmd"<CR><CR>

Теперь, вот довольно чистый и общий способ сделать вещи по-разному в зависимости от платформы:

" Define a global variable containing the current environment's name
" if it hasn't been already defined.
if !exists('g:env')
    if has('win64') || has('win32') || has('win16')
        let g:env = 'WINDOWS'
    else
        let g:env = toupper(substitute(system('uname'), '\n', '', ''))
    endif
endif

и переработанная версия вашего сопоставления с добавленным путем для команды open, который может вам понадобиться или не понадобиться в зависимости от вашего варианта использования:

nnoremap <leader>cmd :execute g:env == "DARWIN" ? "!open -a terminal ." : "!start cmd"<CR><CR>

и альтернативный подход, просто для удовольствия:

let cmds = { "DARWIN": "!open -a terminal .", "WINDOWS": "!start cmd" }
nnoremap <leader>cmd :execute cmds[g:env]<CR><CR>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...