Ru-Board.club
← Вернуться в раздел «Программы»

» Vim

Автор: ASE_DAG
Дата сообщения: 08.05.2012 19:36
Quasus

Цитата:
Здравствуйте.
У меня vim 7.3 на Windows. Собственно, настоящая проблема как раз из-за Windows.
Экспериментирую с фильтрацией (filtering) с помощью python-а 3.2. В vim-e текстовый файл в utf-8. Получать текст из питона я пробовал следующими способами:
sys.stdin.read()
— работает для русских и английских букв. Если сделать
sys.stdin.buffer.read().decode('cp1251'),
аналогично. Если же
sys.stdin.buffer.read().decode('utf-8'),
то для русских не работает. Для греческих букв в исходном файле не работает ни в каком варианте.
Насколько понимаю, когда вим передаёт текст питону, последний почему-то уверен, что это cp1251. Есть ли способ его разубедить?

Для полноты изложения пример скрипта:
import sys
#inp=sys.stdin.buffer.read().decode('cp1251')
inp=sys.stdin.read()
outp=inp + '\nαβγδ.'
sys.stdout.buffer.write(outp.encode())
# the following assumes the output should be in cp1251
# and doesn't accept Greek letters
#sys.stdout.write(outp)

Надеюсь, кто-нибудь сталкивался. Буду благодарен за подсказки. :-)


Здравствуйте. Я даже боюсь предположить, при чем тут Вим. Хотите сказать, что тот же самый скрипт, будучи вызванным не из Вима, работает корректно?
А вообще, я бы попробовал использовать codecs.getreader('utf-8')(sys.stdin) вместо sys.stdin. Можно, наверное, даже переопределить:
sys.stdin = codecs.getreader('utf-8')(sys.stdin)
и аналогично вывод:
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
Автор: Quasus
Дата сообщения: 08.05.2012 20:19

Цитата:

Хотите сказать, что тот же самый скрипт, будучи вызванным не из Вима, работает корректно?


Вообще-то не очень. Кодировки, будь они неладны.

ASE_DAG, спасибо за совет насчёт codecs. Может, придётся ещё когда-нибудь воевать со stdin.

Вопрос перешёл в чисто теоретическую плоскость в связи с успехами на другом направлении. Дело в том, что питоновским интерфейсом пользоваться, конечно, удобней, чем использовать питон для фильтрации. У меня этот интерфейс глючил, однако оказалось, что просто мало патчей. Более того, оказалось, что несложно собрать вим с нужным патчами да ещё и с поддержкой произвольно заданной версии питона.
Автор: ASE_DAG
Дата сообщения: 08.05.2012 21:32
Quasus
> питоновским интерфейсом пользоваться, конечно, удобней, чем использовать питон для фильтрации
Честно говоря, не понял, о чем речь. Что за «питоновский интерфейс», если не сложно, расскажите поподробнее или дайте хорошую ссылку. Может быть, мне (хотя я с Питоном и не сильно знаком) тоже стоит им пользоваться.
Автор: Quasus
Дата сообщения: 13.07.2012 20:57
ASE_DAG, извините, пропустил ваше сообщение.

Я в основном пользовался встроенной справкой по python.

Питоновский интерфейс — это, во-первых, возможность исполнять питоновские команды и файлы (с помощью y(3) и y(3)f, тройка — для третьего), во-вторых, доступ из питона к виму с помощью «модуля» vim, и, в третьих, возможность использовать куски кода на питоне в vim-овских функциях. Например, можно сделать такие команды:


Код:
y3 import vim
y3 l = vim.current.line
y3 vim.current.buffer.append('&'.join(l.split()))
Автор: ASE_DAG
Дата сообщения: 14.07.2012 00:31
Quasus
Спасибо за раз’яснения. :-) Действительно, никогда этим не пользовался, и похоже, что зря не пользовался.
Автор: addhaloka
Дата сообщения: 31.10.2012 02:31
Давно уже обратил внимание на глюк при включении режима редактирования клавишей «Ins» на терминале rxvt(urxvt):



С клавишей «I» нормально включается. На других терминалах (lxterminal, uxterm) такого глюка нет. Вопрос, наверно, не в тему малость, но чето ни здесь, ни в гугле не нашел ответа.

p.s. OS Lubuntu 12.04, Vim 7.3, оболочки zsh и bash, локаль ru_RU.UTF-8; но думаю, это особого значения не имеет, т. к. тоже самое наблюдал и на фрюхе с koi8-r.
Автор: ASE_DAG
Дата сообщения: 31.10.2012 06:07
addhaloka
Баг не подтверждаю. (Ну или я не понял, в чем он должен заключаться.)

Debian Wheezy/Sid.
$ aptitude versions 'rxvt ~i' '^vim$ ~i'
Package rxvt-unicode-256color:
i 9.15-2 testing,unstable 990

Package vim:
i 2:7.3.547-5 testing,unstable 990


Запускаю rxvt-unicode.
$ LANG=ru_RU.UTF-8 vim
<Ins>

Вим перешел в режим вставки, никаких посторонних символов не ввелось.
Автор: addhaloka
Дата сообщения: 31.10.2012 07:00
ASE_DAG
Может, в версии дело? У меня:
$ aptitude versions 'rxvt ~i' '^vim$ ~i'
Пакет rxvt:
i 1:2.6.4-14 precise 500

Пакет rxvt-unicode-256color:
i 9.14-1 precise 500

Пакет vim:
i 2:7.3.429-2ubuntu2.1 precise-updates 500

Хотя врядли - такую же фигню наблюдал года 3 назад на FreeBSD, там явно версии другие были. В общем, ладно, проехали - вопрос все-равно больше теоретический характер имел; заинтересовало просто, wtf Клавиша «I» работает и ладно.
Автор: ASE_DAG
Дата сообщения: 31.10.2012 07:54
addhaloka
> врядли - такую же фигню наблюдал года 3 назад на FreeBSD, там явно версии другие были
Не нахожу логики. Явно же три года назад была меньшая версия, чем стоит у меня.

Между 9.14-1 и 9.15-2 были изменения в работе небуквенных клавиш, не могу из чейнджлога ясно понять, что это за «пустой суффикс» и имеет ли он какое отношение к нашей проблеме, но может иметь. Вы можете это проверить, изучив этот самый патч тов. Сун Пэ, если хотите, или, что проще, поставив пакет из дебиановского репозитория да и посмотрев, что будет.


Цитата:
9.15 Sat Jan 21 13:36:56 CET 2012
    - remove "using namespace std" because clang erroneously
thinks thats an error.
    - finding a matching font (e.g. bold version of the base font)
     was broken (reported by Eamon Walker).
    - fix parsing of bg image styles. They really work now.
    - fix blurring of bg image borders when using xrender.
    - fix xrender blur on common xrender implementations that do
     not behave correctly when the same pixmap is used as source
     and destination in composite operations.
    - fix regression that caused tabbed to compute the wrong size
     for tabs.
    - allow again an empty suffix in a keysym list spec (patch by
     Sung Pae)
.
    - unsupported support for sun studio's CC added.
    - fix -C option on solaris.
Автор: addhaloka
Дата сообщения: 31.10.2012 08:25
ASE_DAG 08:54 31-10-2012
Цитата:
Между 9.14-1 и 9.15-2 были изменения в работе небуквенных клавиш

Не, у меня чето уникальное) Поставил urxvt и vim тех же версий, что и у вас - все-равно буква «P» вылазит.
Автор: ASE_DAG
Дата сообщения: 31.10.2012 16:40
addhaloka
Хм... Ну, я надеюсь, вы и так проверяли на дефолтном конфиге rxvt, это напоминать нет необходимости. А вот $ echo $TERM покажите — мало ли.

P. S. Даже лучше не из шелла, а из Вима:
:!echo $TERM
Автор: addhaloka
Дата сообщения: 31.10.2012 22:03
ASE_DAG 17:40 31-10-2012
Цитата:
Ну, я надеюсь, вы и так проверяли на дефолтном конфиге rxvt, это напоминать нет необходимости. А вот $ echo $TERM покажите — мало ли.

Проверял по всякому:
1. без ~/.Xdefaults (~/.vimrc и конфиги zsh тоже убирал для чистоты эксперимента)
2. под рутом - там bash в качестве loginshell и настроек rxvt не делалось.

Цитата:
а из Вима:
:!echo $TERM

$ vi .zshrc

xterm-256color

Press ENTER or type command to continue

Под рутом:

# vi .profile

rxvt-unicode-256color

Press ENTER or type command to continue
Автор: ASE_DAG
Дата сообщения: 01.11.2012 05:25
addhaloka
> xterm-256color
Очень бы хотелось именно это назвать причиной (неправильный $TERM — неправильный termcap — проблемы со вводом — это логично), однако вы говорите, что и под другим пользователем с $TERM равным rxvt-unicode-256color проблема проявляется. Боюсь, что больше идей у меня пока нет. Но я еще подумаю.
Автор: addhaloka
Дата сообщения: 01.11.2012 07:38
ASE_DAG 06:25 01-11-2012
Цитата:
Очень бы хотелось именно это назвать причиной (неправильный $TERM — неправильный termcap — проблемы со вводом — это логично), однако вы говорите, что и под другим пользователем с $TERM равным rxvt-unicode-256color проблема проявляется.

Да, без разницы. «export TERM="xterm-256color"» в ~/.zshenv прописано, заменил на rxvt-unicode-256color - ничего не изменилось. Кстати в mc Insert без глюков работает.
Автор: ASE_DAG
Дата сообщения: 01.11.2012 07:49
addhaloka
А попробуйте еще под Скрином (в rxvt, разумеется).
$ screen
[новый экран c приглашением]
$ vim
<Ins>


Добавлено:
Да, давайте еще посмотрим, что вообще у вас отправляет клавиша, подписанная «Insert».

$ xev | awk -v RS='\n\n' '/^Key[A-Z]/'
— появится белое окно, переключитесь на него и <Ins>.
Автор: addhaloka
Дата сообщения: 01.11.2012 08:46
ASE_DAG 08:49 01-11-2012
Цитата:
А попробуйте еще под Скрином (в rxvt, разумеется).
Всё так же p. :smile:
Цитата:
Да, давайте еще посмотрим, что вообще у вас отправляет клавиша, подписанная «Insert».

$ xev | awk -v RS='\n\n' '/^Key[A-Z]/'
— появится белое окно, переключитесь на него и <Ins>.

Вывод такой:
KeyPress event, serial 32, synthetic NO, window 0x3000001,
root 0x1ad, subw 0x0, time 172303838, (67,112), root:(1168,954),
state 0x0, keycode 90 (keysym 0xff9e, KP_Insert), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

Автор: ASE_DAG
Дата сообщения: 01.11.2012 16:23
addhaloka
> KP_Insert
О! Вот теперь подтверждаю. На KP_Insert именно такая реакция. На обычный Insert ее нет. Для начала, можете в этом убедиться — на вашей клавиатуре, наверняка есть Ins не только на кейпаде, но и в основной области (у меня-то как раз кейпада нету, пришлось этот ваш KP_Insert эмулировать).

Как быть с локализацией бага — пока не знаю. С одной стороны, действительно похоже на баг Вима — он вроде бы не проявляется в другом софте, где бы его можно было отследить (напр. mcedit), и я нашел по меньшей мере еще один эмулятор терминала, где он проявляется — mlterm. С другой же — в современных (в смысле молодых, недавно написанных с нуля) эмуляторах терминала этой проблемы нет, по крайней мере, я обратного не обнаружил — поищите вы по разным терминалам, вам это, имея аппаратную кнопку, будет проще.
Автор: ASE_DAG
Дата сообщения: 04.11.2012 12:40
addhaloka
Впрочем, может быть это и не баг вовсе. Не берусь судить.
Как для urxvt переопределить KP_Insert на Insert вы, конечно, уже нашли, но для порядку надо здесь написать, что для этого можно в ~/.Xdefaults (или эквивалентном месте) указать такую строку:
URxvt.keysym.KP_Insert: \033[2~
Автор: addhaloka
Дата сообщения: 04.11.2012 16:32
ASE_DAG 13:40 04-11-2012
Цитата:
Как для urxvt переопределить KP_Insert на Insert вы, конечно, уже нашли, но для порядку надо здесь написать, что для этого можно в ~/.Xdefaults (или эквивалентном месте) указать такую строку:
URxvt.keysym.KP_Insert:   /033[2~
Cам не нашел Так что спасибо за подсказку Добавил в ~/.Xdefaults - глюк пропал. Когда искал инфу по этому вопросу, нашел [more=конфиг]
Код: # поведение клавиш
! emulate XTerm for proper recognition of key combinations in Vim
!URxvt.keysym.Up : \033[A !breaks arrow keys in Vim
!URxvt.keysym.Down : \033[B !breaks arrow keys in Vim
!URxvt.keysym.Right : \033[C !breaks arrow keys in Vim
!URxvt.keysym.Left : \033[D !breaks arrow keys in Vim
!URxvt.keysym.Page_Up : \033[5~ !breaks scrolling in Rxvt
!URxvt.keysym.Page_Down : \033[6~ !breaks scrolling in Rxvt
!URxvt.keysym.Home : \033[H !breaks navigation in Vim
!URxvt.keysym.End : \033[F !breaks navigation in Vim
URxvt.keysym.S-Up : \033[1;2A
URxvt.keysym.S-Down : \033[1;2B
URxvt.keysym.S-Right : \033[1;2C
URxvt.keysym.S-Left : \033[1;2D
!URxvt.keysym.S-Page_Up : captured by terminal for scrolling
!URxvt.keysym.S-Page_Down : captured by terminal for scrolling
URxvt.keysym.S-Home : \033[1;2H
URxvt.keysym.S-End : \033[1;2F
URxvt.keysym.M-Up : \033[1;3A
URxvt.keysym.M-Down : \033[1;3B
URxvt.keysym.M-Right : \033[1;3C
URxvt.keysym.M-Left : \033[1;3D
URxvt.keysym.M-Page_Up : \033[5;3~
URxvt.keysym.M-Page_Down : \033[6;3~
URxvt.keysym.M-Home : \033[1;3H
URxvt.keysym.M-End : \033[1;3F
URxvt.keysym.M-S-Up : \033[1;4A
URxvt.keysym.M-S-Down : \033[1;4B
URxvt.keysym.M-S-Right : \033[1;4C
URxvt.keysym.M-S-Left : \033[1;4D
!URxvt.keysym.M-S-Page_Up : seen as Rxvt.keysym.S-Page_Up
!URxvt.keysym.M-S-Page_Down : seen as Rxvt.keysym.S-Page_Down
URxvt.keysym.M-S-Home : \033[1;4H
URxvt.keysym.M-S-End : \033[1;4F
URxvt.keysym.C-Up : \033[1;5A
URxvt.keysym.C-Down : \033[1;5B
URxvt.keysym.C-Right : \033[1;5C
URxvt.keysym.C-Left : \033[1;5D
URxvt.keysym.C-Page_Up : \033[5;5~
URxvt.keysym.C-Page_Down : \033[6;5~
URxvt.keysym.C-Home : \033[1;5H
URxvt.keysym.C-End : \033[1;5F
URxvt.keysym.C-S-Up : \033[1;6A
URxvt.keysym.C-S-Down : \033[1;6B
URxvt.keysym.C-S-Right : \033[1;6C
URxvt.keysym.C-S-Left : \033[1;6D
!URxvt.keysym.C-S-Page_Up : seen as Rxvt.keysym.S-Page_Up
!URxvt.keysym.C-S-Page_Down : seen as Rxvt.keysym.S-Page_Down
URxvt.keysym.C-S-Home : \033[1;6H
URxvt.keysym.C-S-End : \033[1;6F
URxvt.keysym.M-C-Up : \033[1;7A
URxvt.keysym.M-C-Down : \033[1;7B
URxvt.keysym.M-C-Right : \033[1;7C
URxvt.keysym.M-C-Left : \033[1;7D
URxvt.keysym.M-C-Page_Up : \033[5;7~
URxvt.keysym.M-C-Page_Down : \033[6;7~
URxvt.keysym.M-C-Home : \033[1;7H
URxvt.keysym.M-C-End : \033[1;7F
URxvt.keysym.M-C-S-Up : \033[1;8A
URxvt.keysym.M-C-S-Down : \033[1;8B
URxvt.keysym.M-C-S-Right : \033[1;8C
URxvt.keysym.M-C-S-Left : \033[1;8D
!URxvt.keysym.M-C-S-Page_Up : seen as Rxvt.keysym.S-Page_Up
!URxvt.keysym.M-C-S-Page_Down : seen as Rxvt.keysym.S-Page_Down
URxvt.keysym.M-C-S-Home : \033[1;8H
URxvt.keysym.M-C-S-End : \033[1;8F
URxvt.keysym.KP_Insert : \033[2~ #это уже я добавил)
Автор: latin
Дата сообщения: 20.04.2013 05:32
Коллеги! Подскажите, пожалуйста, каким образом настроить Vim, чтобы окно справки по умолчанию открывалось в вертикальном окне?
Автор: ASE_DAG
Дата сообщения: 20.04.2013 07:27
latin
В Виме нет умолчаний. Но всегда можно переопределить сочетание клавиш. Например, так:
:cnorea <expr> h getcmdtype() == ":" && getcmdline() == "h" ? "vert h" : "h"

Здесь getcmdtype() == ":" требуется для отличия командной строки от, например, строки поиска; а getcmdline() == "h" пресекает замену, к примеру, в приказе :w h.
Автор: latin
Дата сообщения: 21.04.2013 11:53
ASE_DAG

Но ведь мы переопределяем заданное первоначальное (реализованное в коде или настройках) поведение, так? Соответственно изменяем стандартные, поставляемые в начальной конфигурации, настройки, т.е. меняем поведение заданное по умолчанию. Во всяком случае именно так понимается мной термин "по умолчанию".

Благодарю за рекомендацию! Я так понимаю, что в части 'getcmdline() == "h"' для того, чтобы ловило все возможные сокращения команды 'help', следует добавить '|| "he" || "hel" || "help"', так?
Автор: ASE_DAG
Дата сообщения: 21.04.2013 14:36
latin
> изменяем стандартные, поставляемые в начальной конфигурации, настройки, т.е. меняем поведение заданное по умолчанию
Если считать умолчанием ввод h по нажатию «h», то конечно.

> Я так понимаю, что в части 'getcmdline() == "h"' для того, чтобы ловило все возможные сокращения команды 'help', следует добавить '|| "he" || "hel" || "help"', так?
Нет, конечно. Во-первых, где вы вообще встречали такой синтаксис? А во-вторых, что «ловить», описано здесь в третьем параметре: :cnorea <expr> h..., далее идет то, на что заменять.

Если развивать до четырех вариантов именно эту строку — просто повторите ее четыре раза.
:cnorea <expr> he getcmdtype() == ":" && getcmdline() == "he" ? "vert he" : "he"
и т. д.
Автор: DollHack
Дата сообщения: 13.08.2013 02:58
Vim 7.4 released

Цитата:
Finally, after more than a thousand patches, there is a new version of Vim. This is mostly a bug-fix release. Also, many runtime files have been improved, syntax highlighting and indenting works better. To find out the details, do ":help version7.4" after installing it. Direct link to the MS-Windows installer. For Linux you probably want to use Mercurial for convenient building. For MacVim look here. Otherwise see the download page.


http://www.vim.org/download.php
Автор: ASE_DAG
Дата сообщения: 04.10.2013 01:13
Здравствуйте, господа.

Предположим, есть такой скриптик:
#!/bin/sh
xterm -hold -e cat "$1" &


Видно, что если его выполнить как $ mytest /tmp/file, то управление немедленно вернется шеллу, а окно икс-терминала останется висеть, пока мы его не закроем. Если его выполнить из Вима как :!mytest %, то будет то же самое.

А вот если установить его в качестве makeprg и запустить «сборку»
:set makeprg=mytest\ %
:make

то все исполнится корректно, но управление не вернется — пользоваться Вимом будет нельзя, пока мы не закроем икс-терм или не пошел Виму ^C. Почему? Как исправить?

P. S. Вопрос не праздный, на самом деле скрипт на основании кода генерирует картинку и хотелось бы сразу получать ее перед глазами и не закрывать. Просто я иллюстрирую проблему на простейшем примере.

Добавлено:
Ага, ну почему — понятно. Я невнимательно посмотрел на вывод. :make исполняет пайп вида !mytest /tmp/ququ 2>&1| tee /tmp/vughsFC/3. Теперь осталось сообразить, что надо сделать. :set makeprg=mytest\ %\ & не подойдет, поскольку вывод ошибки нужен.
Автор: popkov
Дата сообщения: 11.06.2014 09:38
Подскажите, пожалуйста, есть ли в VIM возможность выделять и копировать крупные блоки кода? Сворачивать блоки кода?
Автор: Quasus
Дата сообщения: 11.06.2014 12:13

Цитата:
выделять и копировать крупные блоки кода?


Гм. Так же, как и мелкие куски кода. Даже неважно, на каком языке этот код и даже код это или просто текст.

Например, если нужно скопировать большой блок строк (целых), можно на первой строке поставить метку t, долистать до нижней строки, поставить метку b (если надо будет вернуться) и нажать y't - весь промежуток строк будет скопирован, причём даже выделять его для этого не надо. Если же надо этот кусок выделить, можно было нажать V't.

yi( - скопировать фрагмент, ограниченный парными круглыми скобками (не включая сами скобки)
"zya{ - скопировать фрагмент, ограниченный парными фигурными скобками (включая сами скобки) в регистр z.

Ну и куча вариантов.


Цитата:
Сворачивать блоки кода?


Да. Ключевое слово - fold, например, :help fold.txt. Одна из основным команд сворачивания - zf. Например, zf% сворачивает от текущей скобки до парной, а zfa{ сворачивает текущий блок, ограниченный фигурными скобками. zo разворачивает.
Автор: popkov
Дата сообщения: 11.06.2014 14:00
Quasus

Цитата:
Гм. Так же, как и мелкие куски кода.

Я имел в виду ситуацию, когда найти конец данного огромного блока кода проблематично. Т.е., например, документ имеет глубоко вложенную структуру вроде:

Код: head1[
head2[
head3[
head41[
<...>],
head42[
<...>],
<...>
]]]
Автор: Quasus
Дата сообщения: 11.06.2014 14:12

Цитата:
Я имел в виду ситуацию, когда найти конец данного огромного блока кода проблематично. Т.е., например, документ имеет глубоко вложенную структуру вроде:


Ну да, смотрите мои примеры с метками и с блоками. Команда y сочетается с движениями, поэтому возможностей скопировать по крайней мере столько же, сколько способов перемещения.

Если ваши блоки ограничены квадратными скобками, полезной будет команда % - переход к парной скобке и работа с блоками типа vi[, ya[ и так далее (аналогично можно с предложениями и абзацами).

Если у вас типа тегов XML, тогда не знаю, никогда не работал. Может, есть плагин, который ищет парные теги, а нет - несложно (мне кажется) написать функцию.


Цитата:
А VIM умеет работать с файлами огромного размера (вплоть до 1 Гб)?


Ну, можно попробовать... Хотя если файл сгенерирован, может быть дешевле обойтись sed-ом.


Автор: popkov
Дата сообщения: 11.06.2014 14:37

Цитата:
Если ваши блоки ограничены квадратными скобками, полезной будет команда % - переход к парной скобке и работа с блоками типа vi[, ya[ и так далее (аналогично можно с предложениями и абзацами).
Да, действительно удобно. Только Vim почему-то самопроизвольно переключается в режим вставки. Можно это как-то запретить?

Цитата:
"zya{ - скопировать фрагмент, ограниченный парными фигурными скобками (включая сами скобки) в регистр z.

А как потом извлечь из этого регистра? Можно ли просто скопировать в буфер обмена?

Страницы: 1234

Предыдущая тема: 1C: вопросы по Конфигурациям


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.