LINUX.ORG.RU

14
Всего сообщений: 30

Почему neovim до сих пор использует vimscript?

Почему люди до сих пор пишут плагины на vimscript? В чем подвох? Мне например больше нравится последовательность. Раз уж переписали vim на -> neovim, то будьте добры люди. Давайте все писать на чистом lua. Что вам мешает?

 , , , ,

Deleted ()

Брэм там дизайнит попапы

потом не говорите, что не видели, что дизайн говно, и неудобно использовать…

Говорите - сейчас или молчите навеки.

 ,

pon4ik ()

Вырезать часть имени директории

Синкаю файлы проектов, проекты лежат в разных директориях(локально и удаленно). Есть локальный путь и имя файла. Надо узнать, «остаточный путь до файла» и склеить его с dir_remote, чтобы знать куда его синхронизировать. В python'e выглядит так:

dir_local = "/home/user/media/source_project/dj"
dir_remote = "/home/vasya/source_project/dj"
f_located = "/home/user/media/source_project/dj/djangoexample/apps/chat/models.py"

from os.path import relpath
zzz = relpath(f_located, dir_local)
print(zzz)
f_rsync = '%s/%s' % (dir_remote, zzz)
print(f_rsync)

out:

djangoexample/apps/chat/models.py
/home/vasya/source_project/dj/djangoexample/apps/chat/models.py

 ,

Xwo ()

Помощь по сигнатуре функции в vim

Есть ещё плагины, которые умеют показывать в терминале сигнатуру функции, как это делает jedi-vim?

 , ,

pon4ik ()

viml перехват функций

Можно ли сделать неинтрузивную обёртку над уже определённой функцией?

Юзекейс: автор плагина определяет коллбэк на действие, я хочу повесить дополнительное действие, или полностью альтернативное, в зависимости от флага например.

 ,

pon4ik ()

Viml способ прочитать заданную строку из файла в переменную

На входе имеем имя файла и номер строки.

Надо максимально эффективно, средствами viml считать содержимое строки в переменную.

Пока делаю тупо:

let l:text = readfile(l:path)[l:line]

 ,

pon4ik ()

init файлов

function Hlprs_LoadModules(dirz,...)
  for module in a:1
      execute 'source' fnameescape(a:dirz . '/'. module . '.vim')
  endfor
endfunction

" General
call Hlprs_LoadModules("~/.vim/load/init", [
            \ "general",
            \ "keys"
            \ ])

" Plugins
call Hlprs_LoadModules("~/.vim/load/modules", [
            \ "autofenc",
            \ "closetag",
            \ "colorizer",
            \ "ctags",
            \ "cursorlinecurrentwindow",
            \ "delimitmate",
            \ "easymotion",
            \ "indentline",
            \ "largefile",
            \ "lightline",
            \ "localvimrc",
            \ "matchtagalways",
            \ "nerdtree",
            \ "python-syntax",
            \ "rainbow",
            \ "sessionman",
            \ "snipmate",
            \ "syntastic",
            \ "syntaxrange",
            \ "table-mode",
            \ "tagbar",
            \ "taskwarrior",
            \ "vim-diff-enhanced",
            \ "vim-javascript",
            \ "vim-slime",
            \ "vim-virtualenv",
            \ "vimwiki",
            \ "vitality",
            \ "youcompleteme",
            \ "ctrlp",
            \ "vim-plug",
            \ "vim-javacomplete2"
            \ ])

" Functions
call Hlprs_LoadModules("~/.vim/load/functions", [
            \ "browser",
            \ "common",
            \ "cpp",
            \ "django_templates",
            \ "layout",
            \ "qfix",
            \ "tags",
            \ "virtualenv",
            \ "apply_autopep8",
            \ "wrap_for_tmux"
            \ ])

" autocmd
call Hlprs_LoadModules("~/.vim/load/autocmd", [
            \ "cpp",
            \ "generic",
            \ "html", 
            \ "htmldjango",
            \ "javascript",
            \ "line_return",
            \ "noext",
            \ "other",
            \ "python",
            \ "quickfix",
            \ "table-mode",
            \ "text",
            \ "vim",
            \ ])

А я вот подумал, а не лучше ли сделать типа:

ls ~/.vim/load/autocmd

00_cpp.vim
01_generic.vim
02_html.vim
...
13_vim.vim
и сделать обёртку, которая возьмет по регулярке все digit_text.vim, просортирует их и загрузит их(source), чтобы просто вызвать типа:
call Hlprs_LoadModules("~/.vim/load/init")
call Hlprs_LoadModules("~/.vim/load/modules")
call Hlprs_LoadModules("~/.vim/load/functions")
call Hlprs_LoadModules("~/.vim/load/autocmd")
Что это всё хозяйство выглядело по-человечески.

Кто хочет заморочиться на vimL ? =)

 ,

bryak ()

vim вызвать потокобезопасную функцию из другого потока

Смотрю код пока сам, но глаз уже болит.

Может кто уже маялся таким.

Исходные данные:

  • python функция post_event которая ставит событие в очередь
  • viml функция post_event, которая вызывает python функцию
  • поток разбирающий очередь

Собственно вопрос - будет ли потокобезопасно, вызвать viml функцию post_event, из python скрипта в третьем потоке?

Сама правка контекста python интерпретатора вместе с локами и прочим стейтом по идее должна быть потокобезопасна. А вот как это согласовано с контекстом viml я что-то пока не пойму...

Upd: хочется сделать аналог post_event только вызывабельного из любой скриптоты поддерживаемой vim.

 , , , ,

pon4ik ()

http server в vim

Если бы я вдруг захотел http сервер в vim(8.x) и nvim, который который при обработке запросов вызывал произвольные команды vim, то на какое api мне бы стоило бы посмотреть?

Сам сервер я бы предпочел написать на python.

Резюме: подружить event loop vim'a с многопоточным скриптом реализующим web сервер на данный момент прямого и простого способа нет.

Возможные варианты:

  • использовать вариант +server, при обработке запроса в коде web сервера запускать новый процесс vim, и выполнять на сервере код с помощью --remote-expr
  • Использовать функционал +job/+channel

Я предпочту вариант +job/+channel, т.к. там поддерживается автоматическая обработка выполнения различных комманд и выражений vim в json ответе от job'a, см. раздел справки channel-commands. Соответственно, viml часть можно свести к запуску job'a, всё остальное можно сделать из кода сервера. Хотя, можно и видимо лучше таки определить клиентские функции инициирующие дальнейшую работу в viml части.

 , ,

pon4ik ()

Как сравнить таблицы в vimscript?

let o1 = {}
let o2 = o1
let o3 = {}
let o4 = {}
let o5 = {"a": 1}
let o6 = {"a": 1}

echo o1 == o2 
echo o3 == o4
echo o5 == o6

Все сравнения дают одно и тоже. Подходящих операторов не нашел. Или в вимскрипте таблицы являются примитивами штоле?

И еще, заодно, спрошу. Есть ли возможность получить функцию по ссылке? Может делегаты, или что-нибудь такое?

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


fu Foo()
  echo self.a
endfu

let o1 = {"a": 1}
let o2 = {"a": 2}
let o1.foo = function("Foo")
let o2.foo = function("Foo")

call o1.foo()
call o2.foo()

ругается на self

 , ,

linearisation ()

Покажите ваш хоткей для (горизонтальной) сортировки участка строки

AUDIOFMT="wavpack aac faad flac openal lame mad musepack ogg id3tag opus soundcloud twolame vorbis sndfile"

Нужно отсортировать строку (содержимое между двойными кавычками), мне всё равно, я могу vi" , могу просто курсор туда (на строку) поставить, но нужно отсортировать именно содержимое строковых данных, а не сначала большой строки (т.е. без AUDIOFMT=).

Ваши действия? Придумали уже хоткей для такого, чтобы не делать 3-5 действий типа разбивания на много строк, их сортировку и последующую склейку?

Делитесь или предлагайте плагины, если что, то 'christoomey/vim-sort-motion' так не умеет.

Спасибо.

// Я спрашиваю для вима, но сразу же пользуясь случаем хочу спросить: такое есть в имаксе — из коробки или плагином?

 , , ,

slon ()

vim выполнение скрипта

Значит вот что я хочу: допустим есть

/home/user/test

В нем лежит

/home/user/test/test_script.py
/home/user/test/modules/some/function.py

я хочу, находясь в буффере /home/user/test/modules/some/function.py нажимать ,r и чтобы выполнялся не текущий буффер, а /home/user/test/modules/some/function.py

Значит, что я делаю ? Я создаю /home/user/test/.project и пишу в него exec=test_script.py. Далее я поднимаюсь на уровень выше и чекаю на предмет наличия .project. Нашли ? Да! Далее мне нужно прочитать файл и сплитом добраться до test_script.py. Вот реализация

function! FindRootExec()
    let s:old_path=expand('%:p:h')
    exec "cd " . expand ("%:p:h")
    while ! filereadable (getcwd () . "/.project") && getcwd () != "/"
        cd ..
    endwhile
    cd .
    let real_path = getcwd()
    let projf= getcwd() . "/.project"
    let tmp1 = readfile(projf)
    let tmp2 = split(tmp1[0], "=")
    let tmp3 = real_path . "/". tmp2[1]    
endfunction

В tmp3 лежит /home/user/test/test_script.py. Сейчас у меня в ~/.vim/after/ftplugin/python.vim такой бинд

nnoremap ,r <ESC>:wall!<CR><ESC>:!clear;%:p<CR>
Как дальше поступить ?

PS: плагин project не предлагать:)

 ,

bryak ()

Референсный json мэппинг выхлопа clang.codeCompleteAt

Вопрос из раздела «вдруг кто видел».

Ищется собственно сабж, поясню что я имею ввиду:

  • Все сущности, включая токены смэпленны
  • Используюется в каком-то, достаточно распостраннёном ПО
  • Имеет документацию по правилам мэппинга
  • [Опционально] имеет клиентов написанных на elisp, python, viml

 , , , ,

pon4ik ()

viml тектовый формат для протокола

Какой текстовый формат для потоковой передачи данных выбрать, что бы максимально безболезненно парсить его из viml.

Юзекейс - поток из небольших, структурированных, текстовых сообщений.

 ,

pon4ik ()

Глобальное контекстно-зависимое автодополнение

Предлагаю добить глобальное контекстно-зависимое автодополнение, может у вас уже всё настроенно, а я вот всё никак не могу.

Что значит глобальное контекстно-зависимое автодополнение?

Это означает, что если мы откроем пару файлов vim index.html -O style.css :

<html>
<body>
    <div class="first"><p>hello</p></div>
    <div class="second"><p>hello</p></div>
</body>
</html>
.third {
    margin: 3px;
}

.fourth {
    margin: 4px;
}
если сделать cw на second в левом (первом) файле, то в вариантах комплита должны оказаться в том числе слова third и fourth из правого (другого) файла, если разумеется начать вводить thi и fou. Иначе говоря, в левом html файле должны знать про third и fourth из правого css файла, а также в правом css файле должны быть в курсе first и second.

Как это сделать?

Только что проверил на 4х вариантах:

  • vim + neocomplete
  • vim + neocomplete + tmux-complete
  • vim + YouCompleteMe
  • nvim + deoplete

И нигде автодополнение не работает так, как нужно. С tmux-complete можно пердолить и выпердолить в итоге что-то напоминающее сабж, но будет неудобно всегда использовать tmux для этого.

 , , ,

kep ()

Получить размер буфера в байтах и содержимое буфера в переменную

Цель - вызвать

system("cmd ".string(l:buffer_size), l:buffer_content)

 ,

pon4ik ()

djangotemplates косяк в функции

" detect djangohtml type file
fun! DetectTemplate()
    let n = 1
    while n < line("$")
        if getline(n) =~ '{%' || getline(n) =~ '{{'
            set ft=htmldjango
            return
        endif
        let n = n + 1
    endwhile
    set ft=html "default html
endfun

Дело в том, что если в html'e есть {{{, то функция делает set htmldjango. Получается, что функция детектит по нестрогому соответствию

if getline(n) =~ '{%' || getline(n) =~ '{{'
А как улучшить детект htmldjango ?

 , ,

bryak ()

vim old path save

перед каким-то действием, которое приведет к смене path:

let s:old_path=expand('%:p:h')

После действия хочу восстановить оригинальный path

cd s:old_path

Итог:

E344: Can't find directory "s:old_path" in cdpath

Ничего в поисковике не нашлось, поэтому пишу тут. PS: при этом в old_path путь сохранился и я его нормально вывожу с помощью echom

 ,

bryak ()

Вопрос по виму

В виме есть всякие там алиасы. Значит, я так полагаю, там должен быть какой то мехнизм тиков, который парсит весь текст каждые n миллисекунд, и реплейсит то что надо. Есть ли доступ к этому механизму из UI, из viml, или еще как то? Можно ли в эти тики встраивать свой функционал?

 , ,

somequest ()

Как вызвать MoreMsg?

Есть такой элемент как :hi MoreMsg , тыщу раз наблюдал его, но хоть убейте, не могу вспомнить при каких ситуациях и как вызывать его.

Там (под statusline, в cmd mode) показывается что-то типа:

-- (More) --
и если не изменяет память нужно скролить, либо нажимать Enter для продолжения получения инфы.

Это не вопрос, не ошибка, не showmode, а также не в случае скроллинга при просмотре выхлопа шелла или команд через :! .

Где же этот MoreMsg мы наблюдаем?

 ,

neovim ()