функция vim для переключения цветов - PullRequest
6 голосов
/ 05 июня 2011

В данный момент я использую две разные клавиши для переключения схемы цветов

map <F8> :colors wombat256 <cr>
map <F9> :colors dimtag <cr>


Я хочу добиться такого поведения переключателя, как это

function! ToggleDimTags()
if (g:colors_name == "wombat256")
  colors dimtag
else
  colors wombat256
endif
endfunction

Моя проблема в том, что ToogleDimTags() сбрасывает позицию курсора на первую строку при каждом вызове, что нежелательно. Любые предложения приветствуются.

1 Ответ

8 голосов
/ 06 июня 2011

Как обсуждалось в комментариях, проблема в том, что ваша карта, вызывающая :execute, ведет себя немного иначе, вместо этого вам, вероятно, нужно :call:

nnoremap <F5> :call ToggleDimTags()

Чтобы уточнить, что говорит @ZyX, :h :exec содержит следующий текст:

                                                         :exe   :execute 
:exe[cute] {expr1} ..   Executes the string that results from the evaluation
                        of {expr1} as an Ex command.
                        [...]

Что действительно делает :execute, так это вычисление выражения в поисках строки, которая будет выполнена как команда Ex (также называемая командами с двоеточием).Другими словами:

exec ToggleDimTags() | " <-- ToggleDimTags() is evaluated and returns 0
exec 0

Что означает:

:0

Сейчас, :h :call:

                                                 :cal   :call   E107   E117 
:[range]cal[l] {name}([arguments])
                Call a function.  The name of the function and its arguments
                are as specified with |:function|.  Up to 20 arguments can be
                used.  **The returned value is discarded**.
                [...]

Обновление

Я думал о вашей функции, и, используя троичный оператор и немного магии :execute, вы можете упростить ее до того момента, когда вы откажетесь от дополнительной функции:

nnoremap <silent> <F9> :exec "color " .
    \ ((g:colors_name == "wombat256") ? "dimtag" : "wombat256")<CR>

Здесь, это nnoremap не будет выводить (<silent>) и основан на :exec, за которым следует следующее выражение:

"color " . ((g:colors_name == "wombat256") ? "dimtag" : "wombat256")

Когда g:colors_name установлено на wombat256, выражение оценивается как:

"color dimtag"

Или, иначе:

"color wombat256"

Тогда любой из них оценивается как :exec.Конечно, вы можете присоединиться к строкам (не забывая удалить обратную косую черту), я сделал это просто так, чтобы избежать слишком длинной строки.

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