Text
This commit is contained in:
parent
0125f9cbee
commit
80287870a3
14
wiki/Latex/Висячие строки.md
Normal file
14
wiki/Latex/Висячие строки.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: "LaTeX: висячие строки"
|
||||||
|
category: LaTeX
|
||||||
|
tags: LaTeX, текст
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Пакет [`nowidow`](https://www.ctan.org/pkg/nowidow) используется для
|
||||||
|
изменения алгоритма размещения висячих строк. Пример:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\usepackage[defaultlines=3,all]{nowidow}
|
||||||
|
```
|
||||||
|
|
15
wiki/Latex/Защита команд.md
Normal file
15
wiki/Latex/Защита команд.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: "LaTeX: защита команд"
|
||||||
|
category: LaTeX
|
||||||
|
tags: LaTeX, текст
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Команда `\protect` используется для защиты инструкций внутри
|
||||||
|
хрупких команд. Например, для защиты команды переноса строки
|
||||||
|
внутри команды `section` нужно написать:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\section{Первая строка\protect\\Вторая строка}
|
||||||
|
```
|
||||||
|
|
14
wiki/Latex/Лигатуры.md
Normal file
14
wiki/Latex/Лигатуры.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: "LaTeX: лигатуры"
|
||||||
|
category: LaTeX
|
||||||
|
tags: LaTeX, шрифты
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Команды для запрета использования лигатур:
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\usepackage{microtype}
|
||||||
|
\DisableLigatures[f]{encoding = *, family = *}
|
||||||
|
```
|
||||||
|
|
32
wiki/Latex/Многостраничные таблицы в LyX.md
Normal file
32
wiki/Latex/Многостраничные таблицы в LyX.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
title: "LyX: многостраничные таблицы"
|
||||||
|
category: LaTeX
|
||||||
|
tags: LaTeX, текст, LyX, таблицы
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
- Создать таблицу как минимум с четырьмя строками.
|
||||||
|
- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем
|
||||||
|
меню **Длинная таблица**.
|
||||||
|
- Щелкнуть правой кнопкой мыши на таблице, выбрать во всплывающем
|
||||||
|
меню **Настройки**.
|
||||||
|
- Установить курсор на первой строке таблицы, в окне настроек перейти
|
||||||
|
на вкладку **Длинная таблица**.
|
||||||
|
- Выбрать **Подпись** и **Первый заголовок**.
|
||||||
|
- Нажать **Применить**.
|
||||||
|
- Установить курсор на второй строке таблицы, в окне настроек перейти
|
||||||
|
на вкладку **Длинная таблица**.
|
||||||
|
- Выбрать **Подпись** и **Заголовок**.
|
||||||
|
- Нажать **Применить**.
|
||||||
|
- Установить курсор на третьей строке таблицы, в окне настроек перейти
|
||||||
|
на вкладку **Длинная таблица**.
|
||||||
|
- Выбрать **Заголовок** и **Первый заколовок**.
|
||||||
|
- Нажать **Применить**.
|
||||||
|
- Щелкнуть правой кнопкой мыши на второй строке таблицы, выбрать в меню
|
||||||
|
**Подпись (Ненумерованный)**.
|
||||||
|
- На первой строке таблицы установить метку и ввести текст подписи к
|
||||||
|
таблице на начальной странице.
|
||||||
|
- На второй строке таблицы сформировать текст подписи к таблице,
|
||||||
|
который будет использоваться на последующих страницах.
|
||||||
|
- На третьей строке нужно сформировать заголовок таблицы.
|
||||||
|
|
11
wiki/Latex/Переносы.md
Normal file
11
wiki/Latex/Переносы.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: "LaTeX: переносы строк"
|
||||||
|
category: LaTeX
|
||||||
|
tags: LaTeX, текст
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Текст между командами `\sloppy` и `\fussy` или внутри блока
|
||||||
|
`\begin{sloppypar} ... \end{sloppypar}` будет переноситься
|
||||||
|
сразу при достижении края бокса.
|
||||||
|
|
19
wiki/Latex/Русский в PDF.md
Normal file
19
wiki/Latex/Русский в PDF.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
title: "LaTeX: русский язык в выходном PDF"
|
||||||
|
category: LaTeX
|
||||||
|
tags: LaTeX, текст, PDF
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Для поиска в файле PDF и копирования текста с правильной кодировкой
|
||||||
|
нужно использовать пакет [`cmap`](https://www.ctan.org/pkg/cmap).
|
||||||
|
Включать использование пакета нужно как можно раньше, чтобы правильно
|
||||||
|
формировалась служебная информация и титульные листы.
|
||||||
|
|
||||||
|
```latex
|
||||||
|
\usepackage{cmap}
|
||||||
|
```
|
||||||
|
|
||||||
|
Полезная [информация](http://s.arboreus.com/2007/07/pdf-latex.html)
|
||||||
|
о выводе из $\LaTeX$ в PDF.
|
||||||
|
|
12
wiki/Linux/DPKG/APT.md
Normal file
12
wiki/Linux/DPKG/APT.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: "APT"
|
||||||
|
category: Linux
|
||||||
|
tags: linux, ubuntu, debian, apt
|
||||||
|
summary: ""
|
||||||
|
...
|
||||||
|
|
||||||
|
Запрет загрузки переводов описаний пакетов:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/99translations
|
||||||
|
```
|
17
wiki/Linux/LXC/DNS в контейнере LXC.md
Normal file
17
wiki/Linux/LXC/DNS в контейнере LXC.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: "DNS в контейнере LXC"
|
||||||
|
category: Linux
|
||||||
|
tags: lxc, контейнеры, ubuntu, linux, dns
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
В системе Ubuntu 18.04 работающей внутри контейнера LXC по умолчанию
|
||||||
|
не работает разрешение имён. Чтобы использовать DNS-сервер `8.8.8.8`,
|
||||||
|
нужно внутри контейнера выполнить команды:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sed -i 's/#DNS=/DNS=8.8.8.8/' /etc/systemd/resolved.conf
|
||||||
|
systemctl restart systemd-resolved
|
||||||
|
rm /etc/resolv.conf
|
||||||
|
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
|
||||||
|
```
|
88
wiki/Linux/Runit/runit.md
Normal file
88
wiki/Linux/Runit/runit.md
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
title: runit
|
||||||
|
category: Linux
|
||||||
|
tags: Debian, Ubuntu, Linux, инициализация, runit
|
||||||
|
summary: Система инициализации со встроенными средствами контроля за процессами
|
||||||
|
...
|
||||||
|
|
||||||
|
### Установка
|
||||||
|
|
||||||
|
[runit](http://smarden.org/runit/) — это система инициализации со
|
||||||
|
встроенными средствами контроля за процессами.
|
||||||
|
|
||||||
|
Установка в Ubuntu:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo apt-get install runit runit-systemd
|
||||||
|
```
|
||||||
|
|
||||||
|
### Запуск сервисов от непривилегированного пользователя
|
||||||
|
|
||||||
|
Чтобы разрешить непривилегированному пользователю `user` управлять
|
||||||
|
собственной конфигурацией для runit, нужно с правами суперпользователя
|
||||||
|
выполнить:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir -p /etc/service/run-user/supervise
|
||||||
|
cat > /etc/service/run-user/run << EOF
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
exec 2>&1
|
||||||
|
exec chpst -u user runsvdir /home/user/sv
|
||||||
|
EOF
|
||||||
|
chmod +x /etc/service/run-user/run
|
||||||
|
```
|
||||||
|
|
||||||
|
В результате в каталоге `/home/user/sv` пользователь `user` сможет
|
||||||
|
создавать собственные правила управления сервисами.
|
||||||
|
|
||||||
|
### Пример сервиса
|
||||||
|
|
||||||
|
Для запуска сервера Redis пользователем `user` нужно создать файл
|
||||||
|
конфигурации `/home/user/redis/etc/redis.conf`:
|
||||||
|
|
||||||
|
```
|
||||||
|
daemonize no
|
||||||
|
port 5079
|
||||||
|
tcp-backlog 128
|
||||||
|
timeout 0
|
||||||
|
tcp-keepalive 60
|
||||||
|
loglevel warning
|
||||||
|
databases 1
|
||||||
|
save 300 10
|
||||||
|
dir /home/user/redis/var
|
||||||
|
dbfilename surok.rdb
|
||||||
|
client-output-buffer-limit normal 0 0 0
|
||||||
|
client-output-buffer-limit slave 4mb 1mb 60
|
||||||
|
client-output-buffer-limit pubsub 4mb 1mb 60
|
||||||
|
maxclients 50
|
||||||
|
```
|
||||||
|
|
||||||
|
Запускаемый сервер должен запускаться не в фоновом режиме, чтобы
|
||||||
|
runit мог контролировать его состояние.
|
||||||
|
|
||||||
|
Скрипт `/home/user/sv/redis/run`, который `runit` использует для
|
||||||
|
запуска процесса:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
WORKDIR=/home/user/redis
|
||||||
|
|
||||||
|
cd "${WORKDIR}" || exit 1
|
||||||
|
exec 2>&1
|
||||||
|
exec redis-server etc/redis.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
Журналирование выполняется с помощью входящей в состав пакета
|
||||||
|
runit программы `svlogd`. Скрипт для его запуска должен находиться
|
||||||
|
в подкаталоге `log` (`/home/user/sv/redis/log/run`):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
LOGDIR=/home/user/redis/log
|
||||||
|
|
||||||
|
mkdir -p "${LOGDIR}"
|
||||||
|
exec svlogd -tt "${LOGDIR}""
|
||||||
|
```
|
30
wiki/Misc/Libgen.md
Normal file
30
wiki/Misc/Libgen.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
title: "Libgen: локальная база данных для Windows"
|
||||||
|
category: Windows
|
||||||
|
tags: windows, libgen, библиотеки, книги
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Программа [LibGen - Библиотекарь](http://libruslib.ucoz.com/index/libgen_bibliotekar/0-5)
|
||||||
|
позволяет просматривать локальную копию базы данных сервера [Libgen](http://libgen.io/).
|
||||||
|
Архив базы данных можно скачать [здесь](http://gen.lib.rus.ec/dbdumps/).
|
||||||
|
В архиве базы с именем вида `libgen_YYYY-MM-DD.rar` содержится полная информация
|
||||||
|
для полнотекстового поиска по описаниям книг, а в архиве с именем вида
|
||||||
|
`libgen-compact_YYYY-MM-DD.rar` описания удалены.
|
||||||
|
|
||||||
|
Для обработки полного архива потребуется около 25 Гб свободного пространства.
|
||||||
|
Последовательность действий:
|
||||||
|
|
||||||
|
1. [Скачать](https://yadi.sk/d/j_ToPE7D3SHGN6) и распаковать программу Libgen.
|
||||||
|
2. Скачать архив базы данных, распаковать его в каталог `upload`
|
||||||
|
и переименовать SQL-скрипт в `backup_ba.sql`.
|
||||||
|
3. [Скачать](https://yadi.sk/d/psnuXFJM3SHGR8) архив со скриптами для преобразования
|
||||||
|
базы данных и распаковать его в каталог `upload`.
|
||||||
|
4. Запустить программу `libgen.exe`.
|
||||||
|
5. Выбрать в меню **Databases | Update book database**.
|
||||||
|
6. Убрать галочки **Download from the Internet** и **Unpack** и поставить
|
||||||
|
**Prepare for import to the database**.
|
||||||
|
7. Нажать кнопку **Start**.
|
||||||
|
8. После завершения работы нажать кнопку **Done**.
|
||||||
|
9. Удалить из каталога `upload` файл `backup_ba1.sql`.
|
||||||
|
|
@ -10,7 +10,7 @@ toc: yes
|
|||||||
|
|
||||||
### Информация и лицензия
|
### Информация и лицензия
|
||||||
|
|
||||||
[PVS-Studio](https://www.viva64.com/ru/pvs-studio/) - это инструмент для
|
[PVS-Studio](https://www.viva64.com/ru/pvs-studio/) — это инструмент для
|
||||||
статического анализа исходного кода программ, написанных на языках С, C++.
|
статического анализа исходного кода программ, написанных на языках С, C++.
|
||||||
|
|
||||||
Для использования в Linux нужно чтобы в каталоге `~/.config/PVS-Studio`
|
Для использования в Linux нужно чтобы в каталоге `~/.config/PVS-Studio`
|
||||||
@ -23,7 +23,7 @@ toc: yes
|
|||||||
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
||||||
```
|
```
|
||||||
|
|
||||||
### Настройка и комплияция проекта
|
### Настройка и компиляция проекта
|
||||||
|
|
||||||
Полное руководство для работы в Linux находится
|
Полное руководство для работы в Linux находится
|
||||||
[здесь](https://www.viva64.com/ru/m/0036/), а ниже приведён список типовых команд.
|
[здесь](https://www.viva64.com/ru/m/0036/), а ниже приведён список типовых команд.
|
||||||
@ -68,7 +68,7 @@ ninja -t compdb
|
|||||||
|
|
||||||
Выбор типов предупреждений осуществляется на основе побитовой маски из
|
Выбор типов предупреждений осуществляется на основе побитовой маски из
|
||||||
приведенных выше типов. Чтобы выполнить анализ, исключив проверки MISRA,
|
приведенных выше типов. Чтобы выполнить анализ, исключив проверки MISRA,
|
||||||
нужно выполнить:
|
нужно выполнить
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pvs-studio-analyzer analyze -a 29 -j$(nproc) -o pvs.log
|
pvs-studio-analyzer analyze -a 29 -j$(nproc) -o pvs.log
|
35
wiki/Prog/Development/Подбор ключей компиляции GCC.md
Normal file
35
wiki/Prog/Development/Подбор ключей компиляции GCC.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: Подбор ключей компиляции GCC
|
||||||
|
category: Программирование
|
||||||
|
tags: программирование, C, C++, отладка, оптимизация
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Подбор ключей компиляции основан на измерениях характеристик во
|
||||||
|
время выполнения программы. На первом этапе создаётся исполняемый
|
||||||
|
файл `program`, в который включается информация для профилировки.
|
||||||
|
Ключ `-fprofile-generate=data/pgo` указывает, что нужно собирать
|
||||||
|
информацию и сохранять в каталог `data/pgo`. Компиляцию следует
|
||||||
|
выполнять в последовательном режиме.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
env CXXFLAGS='-fprofile-generate=data/pgo' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
|
||||||
|
make -j1
|
||||||
|
```
|
||||||
|
|
||||||
|
После компиляцию программу следует выполнить, придерживаясь
|
||||||
|
типичного сценария использования.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./program
|
||||||
|
```
|
||||||
|
|
||||||
|
Скомпилировать программу с использованием полученной статистики.
|
||||||
|
Для многопоточной программы следует указать флаг `-fprofile-correction`,
|
||||||
|
чтобы скорректировать данные, которые могут неустойчивыми из-за пропусков
|
||||||
|
обновлений счётчиков. Компиляцию следует выполнять в последовательном режиме.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
env CXXFLAGS='-fprofile-use=data/pgo -fprofile-correction' cmake .. -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles"
|
||||||
|
make -j1
|
||||||
|
```
|
55
wiki/Prog/Development/Профилирование кода.md
Normal file
55
wiki/Prog/Development/Профилирование кода.md
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
title: Профилирование кода
|
||||||
|
category: Программирование
|
||||||
|
tags: программирование, отладка, производительность, профилирование, gprof
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
## Общее описание
|
||||||
|
|
||||||
|
Чтобы профилировать приложения, компилируемые [GCC](http://gcc.gnu.org),
|
||||||
|
необходимо добавлять флаг `-fno-omit-frame-pointer` и желательно `-g`.
|
||||||
|
|
||||||
|
## quickstack
|
||||||
|
|
||||||
|
Утилита для отслеживания стеков вызовов функций [quicktrack](https://github.com/yoshinorim/quickstack).
|
||||||
|
Пример использования:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
quickstack -f -p $(pidof application)
|
||||||
|
```
|
||||||
|
|
||||||
|
## perf
|
||||||
|
|
||||||
|
Утилита профилирования для ядра Linux (находится в дереве его исходных текстов
|
||||||
|
в каталоге `tools/perf`).
|
||||||
|
|
||||||
|
Полезные ссылки:
|
||||||
|
|
||||||
|
* [Официальная страница](https://perf.wiki.kernel.org/index.php/Main_Page)
|
||||||
|
* [Примеры](https://stackoverflow.com/questions/1777556/alternatives-to-gprof/10958510#10958510)
|
||||||
|
* [Примеры](http://www.brendangregg.com/perf.html)
|
||||||
|
|
||||||
|
|
||||||
|
## Systemtap
|
||||||
|
|
||||||
|
[Установка и простые примеры использования SystemTap](https://eax.me/systemtap/)
|
||||||
|
|
||||||
|
|
||||||
|
## Valgrind
|
||||||
|
|
||||||
|
|
||||||
|
## gperftools
|
||||||
|
|
||||||
|
|
||||||
|
## Разное
|
||||||
|
|
||||||
|
* [Профилирование кода на C/C++ в Linux и FreeBSD](https://eax.me/c-cpp-profiling/)
|
||||||
|
* [Примеры](http://gernotklingler.com/blog/gprof-valgrind-gperftools-evaluation-tools-application-level-cpu-profiling-linux/)
|
||||||
|
|
||||||
|
|
||||||
|
## Графическое отображение
|
||||||
|
|
||||||
|
* [Flame Graphs](http://www.brendangregg.com/flamegraphs.html)
|
||||||
|
* [gprof2dot](https://github.com/jrfonseca/gprof2dot)
|
||||||
|
|
@ -6,7 +6,8 @@ summary: ""
|
|||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
1) В главном меню QGis **Слой** - **Добавить слой** - **Добавить векторный слой** выбрать и открыть файл с векторным слоем, например, `map.sxf`.
|
1) В главном меню QGis **Слой** — **Добавить слой** — **Добавить векторный слой**
|
||||||
|
выбрать и открыть файл с векторным слоем, например, `map.sxf`.
|
||||||
|
|
||||||
2) Среди слоёв выбрать слой с рельефом местности и типом геометрии `LineString`.
|
2) Среди слоёв выбрать слой с рельефом местности и типом геометрии `LineString`.
|
||||||
|
|
||||||
@ -19,26 +20,29 @@ summary: ""
|
|||||||
`"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить **OK**.
|
`"CLNAME" ILIKE '%ГОРИЗОНТАЛИ ОСНОВ%'` и нажить **OK**.
|
||||||
|
|
||||||
5) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое,
|
5) На панели **Панель слоёв** правой кнопкой мыши щелкнуть на слое,
|
||||||
содержащем данные о высотах, и выбрать **Сохранить как...**. Появишийся новый
|
содержащем данные о высотах, и выбрать **Сохранить как...**. Появившийся
|
||||||
слой **heights** следует удалить.
|
новый слой **heights** следует удалить.
|
||||||
|
|
||||||
6) В появившемся диалоговом окне выбрать имя выходного файла, например, `heights`.
|
6) В появившемся диалоговом окне выбрать имя выходного файла, например, `heights`.
|
||||||
|
|
||||||
![Имя выходного файла](files/qgis-heights2.png)
|
![Имя выходного файла](files/qgis-heights2.png)
|
||||||
|
|
||||||
7) В каталоге `/home/a/work/map` выполнить команду, которая в файле `heights.shp` из слоя `heights` берёт данные о высотах из
|
7) В каталоге `/home/a/work/map` выполнить команду, которая в файле
|
||||||
поля `SC_4` и генерирует матрицу высот размером 2000 на 2000 в формате BMP.
|
`heights.shp` из слоя `heights` берёт данные о высотах из поля `SC_4`
|
||||||
|
и генерирует матрицу высот размером 2000 на 2000 в формате BMP.
|
||||||
Настойки алгоритма посторения матрицы можно изменять с помощью параметра `-a`:
|
Настойки алгоритма посторения матрицы можно изменять с помощью параметра `-a`:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
gdal_grid -a invdist:power=3.0:smoothing=1.0 -outsize 2000 2000 -of BMP -ot Byte -zfield SC_4 -l heights heights.shp heights.bmp
|
gdal_grid -a invdist:power=3.0:smoothing=1.0 -outsize 2000 2000 -of BMP -ot Byte -zfield SC_4 -l heights heights.shp heights.bmp
|
||||||
```
|
```
|
||||||
|
|
||||||
8) После построения матрицы её можно импортировать в QGis как растровый слой, для этого в главном меню QGis **Слой** - **Добавить слой** - **Добавить растровый слой** нужно выбрать и открыть файл `heights.bmp`. В результате на
|
8) После построения матрицы её можно импортировать в QGis как растровый
|
||||||
панели **Панель слоёв** появится растровый слой **heights**.
|
слой, для этого в главном меню QGis **Слой** — **Добавить слой** —
|
||||||
|
**Добавить растровый слой** нужно выбрать и открыть файл `heights.bmp`.
|
||||||
|
В результате на панели **Панель слоёв** появится растровый слой **heights**.
|
||||||
|
|
||||||
9) С помощью модуля Profile Tool можно построить провиль местности. В главном
|
9) С помощью модуля Profile Tool можно построить профиль местности. В главном
|
||||||
меню нужно выбрать **Модуль** - **Profile Tool** - **Terrain profile**.
|
меню нужно выбрать **Модуль** — **Profile Tool** — **Terrain profile**.
|
||||||
|
|
||||||
10) На панели **Панель слоёв** нужно перенести растровый слой **heights**
|
10) На панели **Панель слоёв** нужно перенести растровый слой **heights**
|
||||||
в конец списка, выделить его и на панели **Profile Tool** нажать **Add Layer**.
|
в конец списка, выделить его и на панели **Profile Tool** нажать **Add Layer**.
|
||||||
|
@ -11,13 +11,18 @@ summary: ""
|
|||||||
Если нужно следить за каталогом `/home/user/dir` и записывать историю
|
Если нужно следить за каталогом `/home/user/dir` и записывать историю
|
||||||
изменений в `/home/user/repo/dir`, то нужно инициализировать репозиторий:
|
изменений в `/home/user/repo/dir`, то нужно инициализировать репозиторий:
|
||||||
|
|
||||||
git init --bare /home/user/repo/dir
|
```sh
|
||||||
|
git init --bare /home/user/repo/dir
|
||||||
|
```
|
||||||
|
|
||||||
добавить шаблоны исключаемых файлов
|
добавить шаблоны исключаемых файлов:
|
||||||
|
|
||||||
printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude
|
```sh
|
||||||
|
printf '*.[oa]\n*.swp\n*~\n/.git' >> /home/user/repo/dir/info/exclude
|
||||||
|
```
|
||||||
|
|
||||||
и запустить скрипт
|
и запустить скрипт:
|
||||||
|
|
||||||
./gitwatch.sh -g /home/user/repo/dir /home/user/dir
|
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./gitwatch.sh -g /home/user/repo/dir /home/user/dir
|
||||||
|
```
|
||||||
|
@ -5,7 +5,7 @@ tags: программирование, git
|
|||||||
summary:
|
summary:
|
||||||
...
|
...
|
||||||
|
|
||||||
Создание репозитория для нового проекта
|
Создание репозитория для нового проекта:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git
|
ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git
|
||||||
@ -13,10 +13,10 @@ git --bare init /home/user/work/usbdisk/git/project.git
|
|||||||
cd /home/user/work/projects
|
cd /home/user/work/projects
|
||||||
git clone /home/user/work/usbdisk/git/project.git
|
git clone /home/user/work/usbdisk/git/project.git
|
||||||
cd project
|
cd project
|
||||||
git remote set-url origin file:///home/user/work/usbdisk/git/project.git/
|
git remote set-url usb file:///home/user/work/usbdisk/git/project.git/
|
||||||
```
|
```
|
||||||
|
|
||||||
Добавление нового удалённого репозитория к существующему проекту
|
Добавление нового удалённого репозитория к существующему проекту:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git
|
ln -s /media/user/usbdisk/git /home/user/work/usbdisk/git
|
||||||
|
@ -10,8 +10,8 @@ summary: ""
|
|||||||
Допустим, по адресу `git://localhost/project.git` находится
|
Допустим, по адресу `git://localhost/project.git` находится
|
||||||
большой проект, в котором интересует только последнее
|
большой проект, в котором интересует только последнее
|
||||||
состояние каталогов `src/driver` и `include/driver`.
|
состояние каталогов `src/driver` и `include/driver`.
|
||||||
Сначала нужно создать репозиторий и подготовить его для
|
Сначала нужно создать пустой репозиторий и подготовить его
|
||||||
получения только необходимых файлов:
|
для получения только необходимых файлов:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git init project
|
git init project
|
||||||
@ -26,4 +26,6 @@ echo "include/driver/*" >> .git/info/sparse-checkout
|
|||||||
а, добавив ключ `--depth=1`, указать, что синхронизироваться
|
а, добавив ключ `--depth=1`, указать, что синхронизироваться
|
||||||
должно только текущее состояние файлов без учёта истории.
|
должно только текущее состояние файлов без учёта истории.
|
||||||
|
|
||||||
git pull --depth=1 origin master
|
```sh
|
||||||
|
git pull --depth=1 origin master
|
||||||
|
```
|
||||||
|
24
wiki/Prog/Git/Gitlab выполнение по расписанию.md
Normal file
24
wiki/Prog/Git/Gitlab выполнение по расписанию.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
title: "GitLab — выполнение по расписанию"
|
||||||
|
category: Программирование
|
||||||
|
tags: программирование, gitlab, git
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
После помещения изменений (push) на сервер следует выполнять только задачи,
|
||||||
|
не требующие много ресурсов. Ресурсоёмкие задачи можно отложить на время
|
||||||
|
минимальной нагрузки сервера. Для этого нужно:
|
||||||
|
|
||||||
|
* в секциях файла `.gitlab-ci.yml`, запускающих задачи с высокой нагрузкой,
|
||||||
|
добавить
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
```
|
||||||
|
|
||||||
|
подробнее это описано [здесь](https://docs.gitlab.com/ee/ci/yaml/#only-and-except-simplified)
|
||||||
|
|
||||||
|
* в веб-интерфейсе в меню **CI/CD** / **Расписания** добавить **Новое расписание**
|
||||||
|
и назначить исполнение задачи на время, когда нагрузка на сервер минимальна.
|
||||||
|
|
@ -8,7 +8,7 @@ toc: yes
|
|||||||
|
|
||||||
[TOC]
|
[TOC]
|
||||||
|
|
||||||
Установка вылолняется в операционной системе Ubuntu Bionic.
|
Установка выполняется в операционной системе Ubuntu Bionic.
|
||||||
|
|
||||||
### LXC
|
### LXC
|
||||||
|
|
||||||
@ -139,7 +139,6 @@ cat /etc/docker/daemon.json
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Ссылки
|
### Ссылки
|
||||||
|
|
||||||
* [GitLab Runner](https://docs.gitlab.com/runner/register/index.html)
|
* [GitLab Runner](https://docs.gitlab.com/runner/register/index.html)
|
||||||
|
1181
wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md
Normal file
1181
wiki/Prog/Lang/CPP/Проверка именования в Clang Tidy.md
Normal file
File diff suppressed because it is too large
Load Diff
28
wiki/Prog/Links/Библиотеки C CPP.md
Normal file
28
wiki/Prog/Links/Библиотеки C CPP.md
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
title: "Библиотеки для C, C++"
|
||||||
|
category: Программирование
|
||||||
|
tags: программирование, C, C++, Qt
|
||||||
|
summary:
|
||||||
|
toc: yes
|
||||||
|
...
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
### C
|
||||||
|
|
||||||
|
* [nanomsg](http://nanomsg.org): сетевое взаимодействие
|
||||||
|
* [noping](https://noping.cc): работа с ICMP-пакетами
|
||||||
|
* [openblas](https://github.com/xianyi/OpenBLAS): оптимизированная версия
|
||||||
|
[BLAS](https://ru.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms)
|
||||||
|
|
||||||
|
### C++
|
||||||
|
|
||||||
|
* [JSON](https://github.com/nlohmann/json)
|
||||||
|
* [fmtlib](https://github.com/fmtlib/fmt): форматирование строк
|
||||||
|
* [spdlog](https://github.com/gabime/spdlog): журналирование
|
||||||
|
* [cpptoml](https://github.com/skystrife/cpptoml): чтение [TOML](https://github.com/toml-lang/toml)
|
||||||
|
|
||||||
|
|
||||||
|
### Qt
|
||||||
|
|
||||||
|
* [Обработка сигналов UNIX](https://github.com/sjinks/qt_signalwatcher)
|
159
wiki/Prog/Time/Работа с датами и временем.md
Normal file
159
wiki/Prog/Time/Работа с датами и временем.md
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
---
|
||||||
|
title: Работа с датами и временем
|
||||||
|
category: Программирование
|
||||||
|
tags: программирование, время, часы, дата
|
||||||
|
summary:
|
||||||
|
toc: yes
|
||||||
|
toc-depth: 4
|
||||||
|
...
|
||||||
|
|
||||||
|
[TOC]
|
||||||
|
|
||||||
|
### Временные шкалы
|
||||||
|
|
||||||
|
В идеале системы учёта времени должны обладать тремя характеристиками:
|
||||||
|
|
||||||
|
1. _точность_ (время базируется на атомном стандарте, каждая секунда
|
||||||
|
отсчитывается как секунда в системе СИ, нет високосных секунд, переводов
|
||||||
|
на зимнее или летнее время и т.п.);
|
||||||
|
2. _простота_ (каждый "день" состоит из 86400 "секунд");
|
||||||
|
3. _календарные дни_ (дни календаря точно соответствуют вращению Земли).
|
||||||
|
|
||||||
|
На практике есть возможность выбрать шкалу только с двумя характеристиками
|
||||||
|
из трёх.
|
||||||
|
|
||||||
|
1. точность и календарные дни. Примером такой шкалы является UTC,
|
||||||
|
в которой отсчёт дней и секунд ведётся разными методами (секунды
|
||||||
|
исчисляются по атомному стандарту, а дни по суточному вращению Земли),
|
||||||
|
а соответствие достигается вводом _секунды координации_;
|
||||||
|
|
||||||
|
2. календарные дни и простота. Примером такой шкалы является POSIX
|
||||||
|
(IEEE Std 1003.1-1988), в которой день всегда равен 86400 секундам;
|
||||||
|
|
||||||
|
3. точность и простота. Этими характеристиками обладают технические
|
||||||
|
шкалы (атомные часы, GPS), в которых не важен учёт дней.
|
||||||
|
|
||||||
|
|
||||||
|
### Классы времени
|
||||||
|
|
||||||
|
Время можно условно поделить на два класса: физическое и гражданское.
|
||||||
|
|
||||||
|
1. _Физическое_ время представляет собой точки на непрерывной шкале, такую
|
||||||
|
концепцию достаточно точно отражает UTC, если можно пренебречь _секундой
|
||||||
|
координации_ (дополнительная секунда, добавляемая к UTC 30 июня или 31 декабря
|
||||||
|
для согласования со средним солнечным временем UT1. В этот момент время
|
||||||
|
условно обозначается как 23:59:60, а на шкале UTC две секунды отображаются
|
||||||
|
как одна).
|
||||||
|
|
||||||
|
2. _Гражданское_ время представляется полями (год, месяц, число, час, минута,
|
||||||
|
секунда, доли секунды, а также временная зона и календарь, который по умолчанию
|
||||||
|
считается Григорианским).
|
||||||
|
|
||||||
|
Почти всегда существует возможность однозначно перевести физическое время
|
||||||
|
в гражданское и наоборот, но при этом следует различать их свойства и
|
||||||
|
применение (ближайшая аналогия — массивы байтов и символьные строки).
|
||||||
|
|
||||||
|
Основная проблема состоит в том, что в обычном употреблении не всегда можно
|
||||||
|
сделать вывод о том, какой класс времени подразумевается, и гражданское
|
||||||
|
время меняется на основании юридических актов (указов, постановлений и т.п.),
|
||||||
|
что приводит к неоднозначности при планировании событий.
|
||||||
|
|
||||||
|
### Обработка на компьютере
|
||||||
|
|
||||||
|
#### Хранение и отображение
|
||||||
|
|
||||||
|
Для ссылки на момент во времени необходимо использовать единую шкалу,
|
||||||
|
на которой нет разрывов, связанных с летним временем. Примером стандарта
|
||||||
|
времени с такой шкалой является UTC. Локальное или местное время для таких
|
||||||
|
целей не подходит, так как на его шкале имеются разрывы и неоднозначности,
|
||||||
|
связанные с переходами на летнее время и обратно.
|
||||||
|
|
||||||
|
Если нужно сохранить значение локального времени, то необходимо сохранить
|
||||||
|
также смещение относительно UTC, чтобы временную отметку можно было
|
||||||
|
интерпретировать однозначно. Необходимо помнить, что местное время может
|
||||||
|
отличаться от UTC на интервал не кратный часу (например, в Нидерландах
|
||||||
|
с 1909-05-01 по 1937-06-30 смещение времени от UTC составляло
|
||||||
|
19 минут и 32.13 секунд).
|
||||||
|
|
||||||
|
Правила хранения и отображения времени:
|
||||||
|
|
||||||
|
1. Время всегда хранится в UTC. При необходимости дополнительно сохраняется
|
||||||
|
информация о временной зоне (смещение и/или название).
|
||||||
|
|
||||||
|
2. Для вывода на экран время переводится в местное.
|
||||||
|
|
||||||
|
3. При выводе на экран отличного от местного времени необходимо указывать
|
||||||
|
название часового пояса или типа исчисления (например, Юлианский календарь).
|
||||||
|
|
||||||
|
|
||||||
|
#### Системное время для администратора
|
||||||
|
|
||||||
|
Системный администратор должен следить за тем, чтобы файлы базы данных
|
||||||
|
описания временных зон **tzdata** имели одну версию в рамках комплекса
|
||||||
|
и обновлялись регулярно, чтобы минимизировать расхождения с внешними
|
||||||
|
системами. Особенно это важно делать при издании новых правил учёта
|
||||||
|
зимнего или летнего времени.
|
||||||
|
|
||||||
|
На серверах аппаратные часы всегда должны использовать UTC. Операционные
|
||||||
|
системы тоже должны использовать UTC, чтобы при возникновении проблем
|
||||||
|
в файлах журналов было указано время в едином формате.
|
||||||
|
|
||||||
|
В рамках комплекса следует использовать синхронизацию времени, даже
|
||||||
|
если нет доверенного источника более высокого уровня.
|
||||||
|
|
||||||
|
|
||||||
|
#### Клиентские приложения
|
||||||
|
|
||||||
|
В общем случае нельзя доверять временным отметкам внешних клиентов,
|
||||||
|
так как невозможно гарантировать их корректность. Программа должна
|
||||||
|
самостоятельно ставить временные отметки для происходящих событий.
|
||||||
|
Исключением являются программные комплексы, в которых предусмотрено
|
||||||
|
наличие доверенных приложений, ответственных за установку временных отметок.
|
||||||
|
|
||||||
|
|
||||||
|
#### Postgresql
|
||||||
|
|
||||||
|
Сервер базы данных должен использовать только временную зону UTC. Для этого
|
||||||
|
в файле настройки сервера `postgresql.conf` должна быть строка
|
||||||
|
|
||||||
|
```
|
||||||
|
timezone = 'UTC'
|
||||||
|
```
|
||||||
|
|
||||||
|
При создании таблиц необходимо использовать типы данных `timestamp without time zone`
|
||||||
|
и `time without time zone`. Если данные о времени должны содержать информацию
|
||||||
|
о временной зоне или смещении относительно UTC, то нужно создать дополнительные
|
||||||
|
столбцы, информацию из которых должно обрабатывать клиентское приложение.
|
||||||
|
Например, временные отметки можно хранить в таком виде
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE TABLE time_stamps (
|
||||||
|
time_stamp time without time zone, -- временная отметка
|
||||||
|
time_zone character(12), -- текстовое название временной зоны
|
||||||
|
shift integer -- смещение локального времени относительно UTC в секундах
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
Смещение следует записывать в четырёхбайтное знаковое целое, так как оно
|
||||||
|
может быть как положительным, так и отрицательным, а его максимальное
|
||||||
|
значение может составлять 14 * 60 * 60 = 50400 секунд. Несмотря на приведённый
|
||||||
|
выше пример с временной зоной Нидерландов, микросекундами можно пренебречь,
|
||||||
|
так как современные временные зоны имеют смещения кратные минутам, а точность
|
||||||
|
до микросекунд в далёком прошлом обычно не требуется.
|
||||||
|
|
||||||
|
Чтобы клиентская программа могла получить выборку, привязанную к некоторой
|
||||||
|
временной зоне можно использовать оператор `AT TIME ZONE`, например
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT TIMESTAMP '2001-02-16 20:38:40Z' AT TIME ZONE 'MSK';
|
||||||
|
```
|
||||||
|
|
||||||
|
В результате время будет преобразовано из временной зоны UTC в MSK.
|
||||||
|
Модификатор `Z` в записи времени указывает на принадлежность зоне UTC.
|
||||||
|
|
||||||
|
|
||||||
|
#### Qt
|
||||||
|
|
||||||
|
Класс `QTimeZone` предназначен для получения информации о временной зоне
|
||||||
|
и перевода времени из одной временной зоны в другую.
|
||||||
|
|
21
wiki/Vim/Vimdiff.md
Normal file
21
wiki/Vim/Vimdiff.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
title: Vimdiff
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
CSS: table-100.css
|
||||||
|
...
|
||||||
|
|
||||||
|
Команды режима `diff` для сравнения и слияния файлов:
|
||||||
|
|
||||||
|
Команда | Назначение
|
||||||
|
-------------|------------
|
||||||
|
`do` | Получить изменения из второго окна в текущее окно
|
||||||
|
`dp` | Вставить изменения из текущего окна во второе окно
|
||||||
|
`]c` | Перейти к следующему отличию
|
||||||
|
`[c` | Перейти к предыдущему отличию
|
||||||
|
`C-W` `C-W` | Переход между окнами
|
||||||
|
|
||||||
|
[Видеоурок](http://vimcasts.org/episodes/fugitive-vim-resolving-merge-conflicts-with-vimdiff/)
|
||||||
|
по трехпутевому слиянию.
|
||||||
|
|
24
wiki/Vim/Замена выделенного блока.md
Normal file
24
wiki/Vim/Замена выделенного блока.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: замена выделенного блока"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
CSS: table-100.css
|
||||||
|
...
|
||||||
|
|
||||||
|
Замену блока, выделенного в режиме VISUAL, можно выполнить
|
||||||
|
последовательностью команд `y:%s/<ctrl-r>"/заменитель/g`.
|
||||||
|
|
||||||
|
Команда | Назначение
|
||||||
|
---------------|-------------
|
||||||
|
`y` | Копирование в регистр "
|
||||||
|
`:` | Перейти в командный режим
|
||||||
|
`%` | Применить ко всему буферу
|
||||||
|
`s` | Замена
|
||||||
|
`Сtrl-r` | Вставка из регистра
|
||||||
|
`"` | Имя регистра (будет предложено по умолчанию)
|
||||||
|
`/` | Разделитель
|
||||||
|
`заменитель` | Новый текст
|
||||||
|
`/` | Разделитель
|
||||||
|
`g` | Для всех вхождений в строке
|
||||||
|
|
48
wiki/Vim/Клавиши Leader и LocalLeader.md
Normal file
48
wiki/Vim/Клавиши Leader и LocalLeader.md
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: клавиши Leader и LocalLeader"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Клавиши `Leader` и `LocalLeader` представляют собой префиксы для команд.
|
||||||
|
Их текущие значения можно посмотреть командами
|
||||||
|
|
||||||
|
```vim
|
||||||
|
:echo mapleader
|
||||||
|
:echo maplocalleader
|
||||||
|
```
|
||||||
|
|
||||||
|
Часто их значения переназначают в файле `$HOME/.vimrc`, например так
|
||||||
|
|
||||||
|
```vim
|
||||||
|
let mapleader = "\<Space>"
|
||||||
|
let maplocalleader = ","
|
||||||
|
```
|
||||||
|
|
||||||
|
Новое значение команды генерируется с помощью текущих значений этих
|
||||||
|
переменных, таким образом последовательность команд
|
||||||
|
|
||||||
|
```vim
|
||||||
|
let mapleader = ","
|
||||||
|
nnoremap <Leader>a :echo "Hey there ,"<CR>
|
||||||
|
|
||||||
|
let mapleader = "\<Space>"
|
||||||
|
nnoremap <Leader>a :echo "Hey there space"<CR>
|
||||||
|
```
|
||||||
|
|
||||||
|
приведёт к тому, что будут созданы две команды `,a` и `<Space>a`,
|
||||||
|
следовательно для получения единообразных команд следует помещать
|
||||||
|
переназначения в начало файла `$HOME/.vimrc`.
|
||||||
|
|
||||||
|
`LocalLeader` отличается от `Leader` тем, что действует только для
|
||||||
|
текущего буфера, поэтому обычно используется в плагинах, загружаемых
|
||||||
|
для определённых типов файлов.
|
||||||
|
|
||||||
|
Таймауты для ввода команд, использующих клавиши `Leader` и
|
||||||
|
`LocalLeader`, настраиваются командой
|
||||||
|
|
||||||
|
```vim
|
||||||
|
set timeout timeoutlen=5000 ttimeoutlen=100
|
||||||
|
```
|
||||||
|
|
22
wiki/Vim/Клавиши PageUp и PageDown.md
Normal file
22
wiki/Vim/Клавиши PageUp и PageDown.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: клавиши PageUp и PageDown"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Чтобы поведение клавиш `PageUp` и `PageDown` совпадало с более
|
||||||
|
привычным, можно добавить в `$HOME/.vimrc` следующий код:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
" Более привычные PgUp / PgDown, когда курсор остаётся в той же строке, "
|
||||||
|
" а не переносится вверх / вниз экрана, как при стандартном PgUp / PgDown. "
|
||||||
|
" Поскольку по умолчанию прокрутка по C-U / C-D, при которой курсор остаётся
|
||||||
|
" на месте, происходит на полэкрана, привязка делается к двойному нажатию
|
||||||
|
" этих комбинаций. "
|
||||||
|
nmap <PageUp> <C-U><C-U>
|
||||||
|
nmap <PageDown> <C-D><C-D>
|
||||||
|
imap <PageUp> <C-O><C-U><C-O><C-U>
|
||||||
|
imap <PageDown> <C-O><C-D><C-O><C-D>
|
||||||
|
```
|
||||||
|
|
33
wiki/Vim/Кодировка файла.md
Normal file
33
wiki/Vim/Кодировка файла.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: кодировка файла"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Для управления кодировкой файлов можно создать дополнительное меню,
|
||||||
|
позволяющее открыть файл в выбранной кодировке, проверить её
|
||||||
|
корректность и сохранить в нужном виде. Пример кода:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
" кодировка для чтения файла
|
||||||
|
set encoding=utf-8
|
||||||
|
" кодировка терминала
|
||||||
|
set termencoding=utf-8
|
||||||
|
" кодировка для записи файла
|
||||||
|
set fileencoding=utf-8
|
||||||
|
" список предполагаемых кодировок в порядке предпочтения
|
||||||
|
set fileencodings=utf8,koi8r,cp1251,cp866,latin1,ucs-2le
|
||||||
|
|
||||||
|
set wildmenu
|
||||||
|
set wcm=<Tab>
|
||||||
|
menu Encoding.Open\ as\ KOI8-R :e ++enc=koi8-r<CR>
|
||||||
|
menu Encoding.Open\ as\ CP1251 :e ++enc=cp1251<CR>
|
||||||
|
menu Encoding.Open\ as\ CP866 :e ++enc=cp866<CR>
|
||||||
|
menu Encoding.Open\ as\ LATIN1 :e ++enc=latin1<CR>
|
||||||
|
menu Encoding.Open\ as\ UCS-2LE :e ++enc=ucs-2le<CR>
|
||||||
|
menu Encoding.Open\ as\ UTF-8 :e ++enc=utf-8<CR>
|
||||||
|
menu Encoding.Convert\ to\ UTF-8 :set fenc=utf-8<CR>
|
||||||
|
map <F12> :emenu Encoding.<Tab>
|
||||||
|
```
|
||||||
|
|
27
wiki/Vim/Комментирование кода.md
Normal file
27
wiki/Vim/Комментирование кода.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: комментирование кода"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
CSS: table-100.css
|
||||||
|
...
|
||||||
|
|
||||||
|
Отмена автоматического комментирования кода при вставке из буфера:
|
||||||
|
|
||||||
|
```Vim
|
||||||
|
autocmd FileType * setlocal formatoptions-=cro
|
||||||
|
```
|
||||||
|
|
||||||
|
Для управления комментированием можно использовать плагин
|
||||||
|
[NerdCommenter](https://github.com/scrooloose/nerdcommenter).
|
||||||
|
Основные команды:
|
||||||
|
|
||||||
|
Команда | Назначение
|
||||||
|
----------------------|----------------------------
|
||||||
|
`[n]<leader\>cc` | комментировать блок
|
||||||
|
`[n]<leader\>cn` | комментировать с учётом вложенности
|
||||||
|
`[n]<leader\>cl` | символ комментария помещать в начало строки
|
||||||
|
`[n]<leader\>ci` | инвертирование комментариев
|
||||||
|
`<leader\>cA` | добавить комментарий в конец строки
|
||||||
|
`[n]<leader\>cu` | раскомментировать блок
|
||||||
|
|
44
wiki/Vim/Менеджер плагинов Plug.md
Normal file
44
wiki/Vim/Менеджер плагинов Plug.md
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
Title: "Vim: менеджер плагинов Plug"
|
||||||
|
Category: Vim
|
||||||
|
Tags: Vim, плагины Vim
|
||||||
|
Summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Автоматическое управление плагинами в Vim можно организовать
|
||||||
|
с помощью менеджера [Plug](https://github.com/junegunn/vim-plug),
|
||||||
|
установить который можно командой
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
|
||||||
|
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
|
||||||
|
```
|
||||||
|
|
||||||
|
Чтобы использовать Plug, нужно добавить в `$HOME/.vimrc`:
|
||||||
|
|
||||||
|
1. Строку `call plug#begin('~/.vim/plugged')`
|
||||||
|
2. Список строк, начинающихся с команды `Plug`, для загрузки плагинов
|
||||||
|
3. Закончить список командой `call plug#end()`
|
||||||
|
|
||||||
|
Пример:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
" Обязательно использовать одиночные кавычки
|
||||||
|
call plug#begin('~/.vim/plugged')
|
||||||
|
|
||||||
|
" Краткая запись для работы с github: https://github.com/junegunn/vim-easy-align
|
||||||
|
Plug 'junegunn/vim-easy-align'
|
||||||
|
|
||||||
|
" Вариант с полным адресом
|
||||||
|
Plug 'https://github.com/junegunn/vim-github-dashboard.git'
|
||||||
|
|
||||||
|
" Загрузка при выполнении команды
|
||||||
|
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
||||||
|
|
||||||
|
" Загрузка для определённого типа файлов
|
||||||
|
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
|
||||||
|
|
||||||
|
" Окончание списка плагинов
|
||||||
|
call plug#end()
|
||||||
|
```
|
||||||
|
|
53
wiki/Vim/Навигация easymotion.md
Normal file
53
wiki/Vim/Навигация easymotion.md
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: навигация по тексту с помощью easymotion"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Плагин [easymotion](https://github.com/easymotion/vim-easymotion)
|
||||||
|
предоставляет функции для удобного перемещения по тексту.
|
||||||
|
Пример настройки:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
" Не включать команды по умолчанию
|
||||||
|
let g:EasyMotion_do_mapping = 0
|
||||||
|
|
||||||
|
" Умный регистр
|
||||||
|
let g:EasyMotion_smartcase = 1
|
||||||
|
|
||||||
|
" <Leader>ec{char} для перехода к {char}
|
||||||
|
map <Leader>ec <Plug>(easymotion-bd-f)
|
||||||
|
nmap <Leader>ec <Plug>(easymotion-overwin-f)
|
||||||
|
|
||||||
|
" s{char}{char} для перехода к {char}{char}
|
||||||
|
nmap s <Plug>(easymotion-overwin-f2)
|
||||||
|
|
||||||
|
" Переход к строке
|
||||||
|
map <Leader>eg <Plug>(easymotion-bd-jk)
|
||||||
|
nmap <Leader>eg <Plug>(easymotion-overwin-line)
|
||||||
|
|
||||||
|
" Переход к слову
|
||||||
|
map <Leader>ew <Plug>(easymotion-bd-w)
|
||||||
|
nmap <Leader>ew <Plug>(easymotion-overwin-w)
|
||||||
|
|
||||||
|
" Навигация по строкам
|
||||||
|
map <Leader>el <Plug>(easymotion-lineforward)
|
||||||
|
map <Leader>ej <Plug>(easymotion-j)
|
||||||
|
map <Leader>ek <Plug>(easymotion-k)
|
||||||
|
map <Leader>eh <Plug>(easymotion-linebackward)
|
||||||
|
|
||||||
|
" Повторить последний переход
|
||||||
|
map <Leader>er <Plug>(easymotion-repeat)
|
||||||
|
|
||||||
|
" Замена стандартного поиска по тексту
|
||||||
|
map / <Plug>(easymotion-sn)
|
||||||
|
omap / <Plug>(easymotion-tn)
|
||||||
|
|
||||||
|
" These `n` & `N` mappings are options. You do not have to map `n` & `N` to EasyMotion.
|
||||||
|
" Without these mappings, `n` & `N` works fine. (These mappings just provide
|
||||||
|
" different highlight method and have some other features )
|
||||||
|
map n <Plug>(easymotion-next)
|
||||||
|
map N <Plug>(easymotion-prev)
|
||||||
|
```
|
||||||
|
|
17
wiki/Vim/Навигация по буферам.md
Normal file
17
wiki/Vim/Навигация по буферам.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: навигация по буферам"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
CSS: table-100.css
|
||||||
|
...
|
||||||
|
|
||||||
|
Команда | Назначение
|
||||||
|
------------------|-----------------
|
||||||
|
`:bn` | следующий буфер
|
||||||
|
`:bp` | предыдущий буфер
|
||||||
|
`:ls` | список открытых буферов
|
||||||
|
`:bd` | закрыть текущий буфер
|
||||||
|
`:b имя_буфера` | переключиться на буфер
|
||||||
|
`:bdа имя_буфера` | удалить буфер по имени
|
||||||
|
|
35
wiki/Vim/Нумерация строк.md
Normal file
35
wiki/Vim/Нумерация строк.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: нумерация строк"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Для переключения режимов отображения слева столбца нумерации
|
||||||
|
строк можно добавить в `$HOME/.vimrc` следующий код:
|
||||||
|
|
||||||
|
```vim
|
||||||
|
" Нумерация строк включена
|
||||||
|
set number
|
||||||
|
" Нумерация строк абсолютная
|
||||||
|
set nornu
|
||||||
|
|
||||||
|
function! ChangeNumbering()
|
||||||
|
if &number
|
||||||
|
if &rnu
|
||||||
|
set nornu
|
||||||
|
else
|
||||||
|
set nonumber
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
set number
|
||||||
|
set rnu
|
||||||
|
endif
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
map <LocalLeader># <Esc>:call ChangeNumbering()<CR>
|
||||||
|
```
|
||||||
|
|
||||||
|
В результате по команде `<LocalLeader>#` будет осуществляться
|
||||||
|
циклическое переключение между абсолютной, относительной нумерацией
|
||||||
|
строк и отключением нумерации.
|
39
wiki/Vim/Проверка орфографии.md
Normal file
39
wiki/Vim/Проверка орфографии.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: проверка орфографии"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim, словарь, орфография
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
Код в `$HOME/.vimrc` для циклического переключения режимов проверки
|
||||||
|
орфографии: два языка, английский, русский и без проверки:
|
||||||
|
|
||||||
|
```Vim
|
||||||
|
" По умолчанию проверка орфографии для русского и английского.
|
||||||
|
setlocal spell spelllang=ru,en
|
||||||
|
set spellsuggest=9
|
||||||
|
|
||||||
|
function! ChangeSpellLang()
|
||||||
|
if &spelllang == "ru,en"
|
||||||
|
setlocal spell spelllang=en
|
||||||
|
echo "spelllang: en"
|
||||||
|
elseif &spelllang == "en"
|
||||||
|
setlocal spell spelllang=ru
|
||||||
|
echo "spelllang: ru"
|
||||||
|
elseif &spelllang == "ru"
|
||||||
|
setlocal nospell spelllang=
|
||||||
|
echo "spelllang: off"
|
||||||
|
else
|
||||||
|
setlocal spell spelllang=ru,en
|
||||||
|
echo "spelllang: ru,en"
|
||||||
|
endif
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" map spell on/off for English/Russian
|
||||||
|
map <C-F7> <Esc>:call ChangeSpellLang()<CR>
|
||||||
|
|
||||||
|
" выбор альтернатив
|
||||||
|
imap <F7> <Esc> z=<CR>i
|
||||||
|
map <F7> z=<CR>
|
||||||
|
```
|
||||||
|
|
12
wiki/Vim/Ссылки.md
Normal file
12
wiki/Vim/Ссылки.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: полезные ссылки"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim
|
||||||
|
summary:
|
||||||
|
...
|
||||||
|
|
||||||
|
* [Vim](http://vim.org)
|
||||||
|
* [Usevim](http://usevim.com/)
|
||||||
|
* [How I boosted my Vim](http://nvie.com/posts/how-i-boosted-my-vim/)
|
||||||
|
* [How to boost your Vim productivity](https://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/)
|
||||||
|
* [Vim Awesome](https://vimawesome.com/)
|
22
wiki/Vim/Управление окнами.md
Normal file
22
wiki/Vim/Управление окнами.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
title: "Vim: управление окнами"
|
||||||
|
category: Vim
|
||||||
|
tags: Vim, команды Vim
|
||||||
|
summary:
|
||||||
|
CSS: table-100.css
|
||||||
|
...
|
||||||
|
|
||||||
|
Команда | Назначение
|
||||||
|
--------------------|-------------------------
|
||||||
|
`:split filename` | открыть в новом окне (горизонтальное разделение)
|
||||||
|
`:vsplit filename` | открыть в новом окне (вертикальное разделение)
|
||||||
|
`<C-W>` `<C-W>` | перейти к следующему окну
|
||||||
|
`<C-W>` `q` | закрыть текущее окно
|
||||||
|
`<C-W>` `o` | развернуть окно полностью
|
||||||
|
`<C-W>` `_` | развернуть окно по высоте
|
||||||
|
`<C-W>` `|` | развернуть окно по ширине
|
||||||
|
`<C-W>` `=` | выровнять размер окон
|
||||||
|
`<C-W>` `+` | увеличить окно на 1 строку
|
||||||
|
`<C-W>` `-` | уменьшить окно на 1 строку
|
||||||
|
`<C-W>` `стрелки` | перемещение между окнами
|
||||||
|
|
Loading…
Reference in New Issue
Block a user