LINUX.ORG.RU

Повесть несколько команд на сочетание клавиш

 ,


0

1

Привет.
Есть в виме terminal mode, мне вполне нравится, но есть одно но - отсутствует возможность отчистить терминальный буфер. В целом это не проблема - сделал так:

function Clear_terminal()
	if winnr('$') == 1
		let l:only_window = 1
	else
		let l:only_window = 0
	endif
	bd!
	terminal
	if only_window
		only
	endif
endfunction

function Terminal_started()
	setlocal nonumber
	nmap <buffer> <C-w>l :call Clear_terminal()<CR>
endfunction

augroup Mode_hooks_group
	autocmd!
	...
	autocmd TerminalOpen * call Terminal_started() 
augroup End

Но есть одна проблема - вызвать Clear_terminal() я могу лишь в нормальном режиме (внутри Terminal mode), в режиме ввода команд сделать этого никак не получается. Всякие наивные попытки вроде

tmap <C-w>l <C-w>N<C-w>l "выход в нормальный режим, а следом ввод <C-w>l для вызова функции

проваливаются, происходит выход в норм режим, а вторая часть этой комплексной команды игнорится. Как из режима вставки дёрнуть Clear_terminal()? Т.е одним нажатием <C-w>l без ручного выхода в норм режим.

★★

Последнее исправление: kvpfs (всего исправлений: 1)

Проверял так:

function! Clear_terminal()
    if winnr('$') == 1
        let l:only_window = 1
    else
        let l:only_window = 0
    endif
    bd!
    if only_window
        terminal ++curwin
    else
        terminal
    endif
endfunction

function! Terminal_started()
    setlocal nonumber
    tnoremap <buffer> <c-w>l <c-w>:call Clear_terminal()<CR>
endfunction

augroup Mode_hooks_group
    autocmd!
    autocmd TerminalOpen * call Terminal_started() 
augroup End

Всё вроде работает. Vim 8.2.2876.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Спасибо.

… <c-w>l <c-w>:call …

о, так можно было

У меня так получилось:

tmap <buffer> <C-w>l <C-\><C-n>:call ...

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

function Clear_terminal()
	if winnr('$') == 1
		let l:only_window = 1
	else
		let l:only_window = 0
	endif
	call feedkeys("i^A^Kpwd>/tmp/vimconsle_currentpath\n^WN")      "посыл key stroke'ов

	let l:cur_path = readfile("/tmp/vimconsle_currentpath", "", 1)[0]  "чтение из файла
	execute("lcd " . cur_path)

	bd!
	terminal
	if only_window
		only
	endif
	"let l:cur_path = readfile("/tmp/vimconsle_currentpath", "", 1)[0]
	"call execute("lcd " . cur_path)
endfunction

Вообще с vimscript’ом интересно как-то получается - лезу редко, успеваю забыть и каждый раз учу эту муть заново )), у меня также с автотулзами было, хотя такие его куски как libtool я так и не осилил. Всё же самое приятное и универсальное - это си подобное что-нибудь, сходу въезжаешь и быстро пишешь что надо (вроде awk). А с этим пол дня только вникать надо, чтобы благополучно забыть.

kvpfs ★★
() автор топика
Ответ на: комментарий от kvpfs

Если будет желание попытаться ещё, то есть :help terminal-api. Можно из оболочки начинать очистку и передавать в Vim текущий каталог.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Как-то потыкал, с ходу не заводится (может неправильно пытаюсь escape последовательности слать, хз). Ещё пытался парсить буфер терминала через АПИ, но опять же - я не могу получить ту инфу, создание которой инициировал в той же функции (через pwd), в которой и получаю, можно достать лишь с прошлого вызова. В общем и ладно - после всего этого секс-тура невольно появляется мысль - а может и х** с ним? Вроде не сложно поиском прыгнуть на предыдущий ‘$’ )).

В целом очень годный терминал в виме, мне очень понравился, я бы даже его вкрутил дефолтно автоматом запускаться при вызове консоли если бы не один баг какой-то: при открытии исходников программерских что-то происходит с цветами - становятся темнее. Поэтому без голой консоли тоже не обойтись.

kvpfs ★★
() автор топика
Ответ на: комментарий от kvpfs

terminal-api ограничено, там может что-то сделать чтобы разрешить в конкретном терминале и ещё правильно функции именовать. Но вообще да, я не вижу смысла заморачиваться.

Цвета в vim внутри gvim? Тогда это cterm цвета, наверное.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Вим консольный. Например, запускаю терминал в виме, открываю хелоуворлд.сс через него, открывается вим в виме и с цветами какая-то беда - всё тусклое. Вроде и мелочь, но с этим сложно жить. При этом в цпп мод хуке нет никаких цветовых настроек, лишь несколько мэпов.

kvpfs ★★
() автор топика
Ответ на: комментарий от kvpfs

Подчинил вроде, у меня ST терминал, в .vimrc добавил:

set termguicolors
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"

Сделаю при запуске терминала сразу запуск вим инстанс в терминальном режиме.

kvpfs ★★
() автор топика

В vim терминале синий цвет еле различим (цвет директорий в выхлопе ls). Закостылил фикс (смена цвета на циан с подчёркиванием):

function Terminal_hook()
	setlocal nonumber
	call term_sendkeys('', "eval $(dircolors <(echo 'DIR 1;4;36'))\n")
endfunction

augroup Mode_hooks_group
	autocmd!
	...
	autocmd TerminalOpen * call Terminal_hook() 
augroup End
kvpfs ★★
() автор топика
Ответ на: комментарий от StillSteal

Спасибо, годится. Осветлил немного синие оттенки, стало норм:

let terminal_ansi_colors = ["#000000", "#e00000", "#00e000", "#e0e000",
			\"#006fd1", "#e000e0", "#00e0e0", "#e0e0e0", "#808080", "#ff4040",
			\"#40ff40", "#ffff40", "#8585ff", "#ff40ff", "#40ffff", "#ffffff"]

kvpfs ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.