Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

vim

Автор Квас, декабря 18, 2011, 21:53

0 Пользователи и 1 гость просматривают эту тему.

Demetrius

Цитата: User Sapiens от декабря 21, 2011, 21:02
Благодаря возможностям настройки vim-а его можно настроить именно так как хочется, учитывая только свои пожелания и наклонности, а не зависеть от «злого программиста».
...но при этом для его настройки во многом самому придётся быть злым программистом...

Квас

Цитата: Demetrius от декабря 21, 2011, 21:05
...но при этом для его настройки во многом самому придётся быть злым программистом...

Что правильно. :yes: Чем лучше в век компьютеров человек владеет компьютером, тем лучше.
Пишите письма! :)

User Sapiens

Цитата: Demetrius от декабря 21, 2011, 21:05
Цитата: User Sapiens от декабря 21, 2011, 21:02
Благодаря возможностям настройки vim-а его можно настроить именно так как хочется, учитывая только свои пожелания и наклонности, а не зависеть от «злого программиста».
...но при этом для его настройки во многом самому придётся быть злым программистом...
Конечно. Но, по большему счёту, vim самодостаточен как хороший блокнот уже «из коробки», поэтому пользователи которые хотят просто писать текст и не размышлять о смысле блокнотной жизни могут спокойно им пользоваться.
Когда же речь идёт о более продвинутом пользовании, то, чаще всего, такие пользователи имеют нужное понимание действий и могут себе позволить немного побыть «злыми программистами», чтобы ещё более облегчить себе жизнь.
Соглашусь также с Квасом — «Чем лучше в век компьютеров человек владеет компьютером, тем лучше». А то когда видишь подростков, которые выросли на этой технике, но даже не в состоянии пользоваться слепой печатью, сразу думаешь о том сколько времени они смогли бы сэкономить и как они смогли бы упростить себе жизнь. А это именно то зачем компьютеры были созданы и никакие игры и соц. сети этого не заменят.
Предвидя замечания о смещении функций компьютеров в сторону развлечений и ко., хочу только заметить, что даже время на домашние работы, типа рефератов (которые на сегодняшний день делаются с помощью компьютер) можно было бы сократить в несколько раз и уже свободное время провести за играми, а не стонать о непосильных домашних заданиях.

Ух что-то я расписался... а тема всего лишь о простом блокнотике
,,Den Stil verbessern — das heißt den Gedanken verbessern, und gar nichts weiter!"
Nietzsche
"A question is really an ambiguous proposition; the answer is its determination."
Langer
«Il est encore plus facile de juger de l'esprit d'un homme par ses questions que par ses réponses»
de Lévis

Квас

Пишите письма! :)

Квас

Я так понимаю, чудиков, которые одновременно юзают vim и Windows, у нас маловато. ;D Всё равно представлю на суд публики альфа-версию AutoHotkey-скрипта, который должен облегчить жизнь с раскладками.

Общая идеология такая: при переходе из Insert в Normal используемая раскладка должна запоминаться, а текущая раскладка должна становиться английской. Соответственно, при переходе в режим Insert или Replace должна восстанавливаться раскладка.

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


; Two chief objectives of this script are:
; - to switch the layout to English entering the Normal mode;
; - to save the text layout when quitting the text modes and to restore it entering them again.
; It is convenient to group the basic modes as follows:
; Normal : Normal, Visual, Select
; Insert : Insert, Replace
; Command-line : Command-line
; Ex : Ex

GetActiveKeyboardLayout()
{
WinGet, WinID,, A
ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
Return, InputLocaleID
}
SetLayout(Layout)
; The function accepts hexadecimal layout code or one of specific strings as its argument.
{
ControlGetFocus, C, A
If (Layout = "English")
{
PostMessage, 0x50,, 0x4090409, %C%, A
}
Else If (Layout = "Russian")
PostMessage, 0x50,, 0x4190419, %C%, A
Else If (Layout = "Russian_mash")
PostMessage, 0x50,, 0xf0080419, %C%, A
Else
PostMessage, 0x50,, %Layout%, %C%, A
}

SetTitleMatchMode, 2
WinActivate, GVIM

gosub, SetNormal
TextLayout := "English" ; default layout
return

#Hotstring *B0C?



#If Winactive("GVIM") and (Mode = "Normal") and (not CommandInput)

~Insert::
::i::
::I::
::a::
::A::
::o::
::O::
::R::
::s::
::S::
gosub, SetInsert
return

::c::
CommandInput := true
Input, tmp, VL2, {Esc}, "w,b,iw,aw,G,gg"
If ErrorLevel=Match
gosub, SetInsert
CommandInput := false
return

::r::
gosub, SetInsert
Input, tmp, VL1
gosub, QuitInsert
gosub, SetNormal
return

~+sc27:: ; colon
::/::
::?::
::!::
gosub, SetCommandLine
return

::Q::
gosub, SetEx
return

#If Winactive("GVIM") and (Mode = "Insert")

~Esc::
gosub, QuitInsert
gosub, SetNormal
return

#If Winactive("GVIM") and (Mode = "CommandLine")

~Esc::
~Enter::
gosub, SetNormal
return

#If Winactive("GVIM") and (Mode = "Ex")

::vi::
gosub, SetNormal
return

SetNormal:
Mode := "Normal"
SetLayout("English")
CommandInput := false
return

SetInsert:
Mode := "Insert"
SetLayout(TextLayout)
return

QuitInsert:
TextLayout := GetActiveKeyboardLayout()
return

SetCommandLine:
Mode := "CommandLine"
return

SetEx:
Mode := "Ex"
return


Пишите письма! :)

Квас

По мере использования последнего скрипта он имел тенденцию увеличиваться и усложняться. Например, символы-имена регистров не должны вызывать смены режима, и т. д. Поскольку смена режима производится разнообразными способами, а AHK работает «вслепую», то это костыль в чистом виде.

Придумал новое решение, идеологически верное.

О состояниях vim-а никто не знает лучше, чем сам vim. В то же время он не обязан разбираться в операционной системе (в частности, уметь менять раскладку). Следовательно, оптимальным вариантом является взаимодействие vim-а с приложением, которое хорошо работает с системой (AHK).

Взаимодействие я придумал организовать с помощью почты. В vimrc написал

autocmd InsertEnter *.* :call writefile(["1"], "c:\\blahblahblah.txt")
autocmd InsertLeave *.* writefile(["1"], "c:\\blahblahblah.txt")

Теперь при входе и выходе в режимы Insert и Replace vim оставляет записку. А AHK её мониторит:


loop
{
old_insert_mode := insert_mode
FileReadLine, insert_mode, %letter_from_vim%, 1
if (not old_insert_mode and insert_mode)
gosub, SetInsert
if (old_insert_mode and not insert_mode)
gosub, QuitInsert
Sleep, 10
}

Под метками SetInsert и QuitInsert выполняются манипуляции с раскладками.

Переменная insert_mode оказывается полезной и для языковой поддержки с помощью AHK: в зависимость от неё можно ставить автозамены, производящие разные юникодные символы, и в Normal mode всегда будет чистый ascii.

Кстати, с вводом символов проблем нет. Почему-то не всегда работают AHK-автозамены, но разные символы в принципе можно вводить с помощью ^Vu<номер> или диграфов, что уже спокойно можно повесить на AHK-автозамены.

Короче говоря, препятствий к использованию нет! ;up:
Пишите письма! :)

Domi

Вы так говорите, как будто текущая версия не костыль...

I. G.

...И мимимишечных круглышек,
Что безусловно хороши,
Но очень вредны для души.

Квас

Спрошу такую вещь.

Прочитал про filtering: блок текста передаётся внешней программе и замещается аутпутом этой программы. Интересно, можно ли это сделать, например, для скрипта на питоне? И каким образом этот скрипт должен возвращать аутпут?
Пишите письма! :)

Квас

Цитата: Квас от января  2, 2012, 15:28
autocmd InsertEnter *.* :call writefile(["1"], "c:\\blahblahblah.txt")
autocmd InsertLeave *.* writefile(["1"], "c:\\blahblahblah.txt")

Разумеется, во втором случае 0 вместо 1.
Пишите письма! :)

абырвалг

Цитата: Квас от января  4, 2012, 18:31
Спрошу такую вещь.

Прочитал про filtering: блок текста передаётся внешней программе и замещается аутпутом этой программы. Интересно, можно ли это сделать, например, для скрипта на питоне? И каким образом этот скрипт должен возвращать аутпут?
Программа на Python'е должна читать стандартный канал ввода (sys.stdin) и писать данные в стандартный вывод (sys.stdout). Работать с ними можно, как с обычными файлами.

Тащемто print("hello") в sys.stdout и пишет.

Вот пример программы, которая к каждой строке добавляет смайлик:
from sys import stdin
for s in stdin:
    print(s.rstrip() + " :)")


Бо́льшая проблема—как это запустить в vim'е. В Linux-то всё просто:

В Windows, скорее всего, придется в vim'е вызывать его так:
:%!C:\Python3\pyton.exe нашФайл
Хотя я и не проверял.

Из того, что приходит в голову: можно занести путь к Python'у в переменную окружения PATH. Можно сделать bat-файл, и вызывать bat-файл (хотя я не уверен, что можно).

Квас

абырвалг, спасибо! Ответ на главную мою непонятность в следующем:
Цитата: абырвалг от января  4, 2012, 19:45
Программа на Python'е должна читать стандартный канал ввода (sys.stdin) и писать данные в стандартный вывод (sys.stdout). Работать с ними можно, как с обычными файлами.
А как к vim-у прикрутить — надо поэкспериментировать.
Пишите письма! :)

Квас

А что по поводу стратегии работы в виме с текстом? Конкретно, с разбиением на строки.

С одной стороны, автоматически разбивать на строки довольно удобно (например, при организации обратного поиска).

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

Видимо, лучше вернуться к старым привычкам и не разбивать на строки. Что тогда с навигацией? Получается, что команды j и h перемещают между абзацами, а внутри абзаца можно двигаться по предложениям, по словам или до символа. В принципе, это логично, только скобки нажимать не так удобно, как клавиши основного ряда.
Пишите письма! :)

Д3

У меня нет под рукой вима сейчас (сижу в Windows), так что проверяйте, работают ли мои советы, сами. :green:

Цитата: Квас от февраля  5, 2012, 12:03
Но неудобства у автоматического разбиения более серьёзные. Во-первых, при редактировании строки получаются самой разной длины, и надо не забывать разбивать их снова.
Установите себе :set fo=a2w, пусть vim сам и разбивает. :donno: Полный список возможных опций (кроме a2w) см. в fo-table.

ЦитироватьВо-вторых, структура абзаца никак не связана со строками, поэтому команды типа «удалить строку» бесполезны, ограниченно работает поиск символа в (команда f) и пр.
Может, стоит использовать { и } для навигации по абзацам? :-\

Цитата: Квас от февраля  5, 2012, 12:03Видимо, лучше вернуться к старым привычкам и не разбивать на строки. Что тогда с навигацией? Получается, что команды j и h перемещают между абзацами, а внутри абзаца можно двигаться по предложениям, по словам или до символа. В принципе, это логично, только скобки нажимать не так удобно, как клавиши основного ряда.
Для перехода по строкам можно использовать gj и gk. Можно даже сделать команды j и k основными:
noremap  <buffer> <silent> k gk
noremap  <buffer> <silent> j gj

Взято отсюда: http://vim.wikia.com/wiki/Move_cursor_by_display_lines_when_wrapping, по ссылке больше всего.

P.S. А я отошёл от вима и доволен. ëat:

Квас

Спасибо большое за советы!

Цитата: Д3 от февраля  5, 2012, 12:51
P.S. А я отошёл от вима и доволен. ëat:

У меня, напротив, рвение неофита. ;D

С помощью AHK сделал себе модальным Far. Передвигаюсь теперь по hjkl. :green:
Пишите письма! :)

Квас

Цитата: Д3 от февраля  5, 2012, 12:51
ЦитироватьВо-вторых, структура абзаца никак не связана со строками, поэтому команды типа «удалить строку» бесполезны, ограниченно работает поиск символа в (команда f) и пр.
Может, стоит использовать { и } для навигации по абзацам? :-\

Это конечно.

Речь о навигации внутри абзаца: разрывы строк препятствуют, например, командам f и F.
Пишите письма! :)

Дм

Цитата: Квас от февраля  8, 2012, 11:13
С помощью AHK сделал себе модальным Far. Передвигаюсь теперь по hjkl. :green:
Под Линукс был какой-то файлменеджер с интерфейсом как у vim'а. Но когда я проверял, в нём не было поддержки UTF-8.

Квас

Пишите письма! :)

Квас

vim + python3

Предположим, имеется юникодный файл с кириллическим текстом. Поместим курсор на какую-нибудь достаточно длинную строку (дюжины символов хватит).

Фокус:

:py3 import vim
:py3 l = vim.current.line
:py3 vim.current.line = l

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

(Если кто-то попробует повторить, и не будет получаться, то нужно проверить с помощью version, есть ли python3; работает с той версией питона, с которой вим скомпилирован — у меня 3.1.)
Пишите письма! :)

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр