Как переключить разделенное окно в Vim - PullRequest
1 голос
/ 20 июня 2019

У меня установлен плагин TaskWarrior. Чтобы показать задачи, вы должны ввести команду :TW. Проблема в том, что TaskWarrior отображается в том же буфере, который я использую для редактирования. Чтобы избежать этого, я должен создать новое окно Split, переключиться в окно Split и затем ввести :TW.

Я хочу иметь команду, которая делает это в стиле "переключатель / переключатель". Команда не создаст новое разделенное окно, если разделенное окно уже существует. Например, у меня есть команда nt нажатий клавиш, и она создает / удаляет разделенное окно каждый раз.

Любые предложения о том, с чего начать и насколько сложно выполнить задачу?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Я адаптировал некоторый онлайн-код, и сейчас он неплохо справляется. Это переключит вкладку разделения TaskWarrior при нажатии комбинации nt.

" Toggle TaskWarrior
nnoremap nt :call ToggleTaskWarriorMode()<CR>
vnoremap nt :call ToggleTaskWarriorMode()<CR>gv

let g:TaskWarriorMode = 0

function! ToggleTaskWarriorMode()
    let g:TaskWarriorMode = 1 - g:TaskWarriorMode
    if (g:TaskWarriorMode == 0)
       :close
    else
       :split task
       :TW
    endif
endfunction
1 голос
/ 20 июня 2019

Я думаю, что вы можете сделать это, определив пользовательскую команду, используя один из языков, который был скомпилирован в вашу копию vim. Я возьму на себя Python. Посмотрите, работает ли это: :py3 print('hello world'). Если это так, то документация специально обсуждает манипулирование окнами:

5. Window objects                                       python-window

Window objects represent vim windows.  You can obtain them in a number of ways:
        - via vim.current.window (python-current)
        - from indexing vim.windows (python-windows)
        - from indexing "windows" attribute of a tab page (python-tabpage)
        - from the "window" attribute of a tab page (python-tabpage)

You can manipulate window objects only through their attributes.  They have no
methods, and no sequence or other interface.

Если объединить это с примером из здесь :

For anything nontrivial, you'll want to put your Python code in a separate 
file, say (for simplicity) x. To get that code into a Vim session, type

 :source x

from within that session. That file will actually be considered to be 
Vimscript code, but with Python embedded.

Extending the above obligatory "hello wordl" example, place

    :map hw :py3 print("hello world")

in x. From then on, whenever you type 'hw' in noninsert mode, you'll 
see the greeting appear in the status line.

For more elaborate code, The format of the file x is typically this:
python << endpy
import vim
lines of Python code
endpy

Не похоже, что вы натолкнетесь на то, что делает именно то, что вы ищете, подобно этому:

py3 << __EOF__
import vim
def do_window_stuff(foo):
    if vim.current.window == foo:
        <do some stuff>
__EOF__
command WindowThing :py3 do_window_stuff(foo)
" OR
noremap .windowthing :py3 do_window_stuff(foo)

Это встраивание питона в Vimscript. Последние несколько строк отобразят пользовательскую команду в функцию python do_window_stuff ().

Использование command позволит вам вызвать его из командной строки в режиме :WindowThing (команда должна начинаться с заглавной буквы).

Использование noremap переназначит последовательность клавиш .windowthing при вводе из режима без вставки.

...