- Преамбула, конфиг для конфигов
- bashrc
- emacs
- git
- globalrc
- inputrc
- mimeapps.list
- parcellite
- perlcritic
- perltidy
- ssh
- stalonetray
- urxvt
- vim
- xcompose
- xmobar
- xmonad
- xresources
- /etc/systemd/logind.conf
- /etc/acpi/events/xlockscreen (блокировка экрана при закрытии крышки)
- Исходник статьи
- Прочее (tangle на сниппеты не включен)
В этой статье собраны публичные части моих десктопных конфигов. Из
исходника статьи в формате org-mode
десктопы автоматически
конфигурируются. Это происходит через ob-tangle
— систему экспорта
SRC-блоков в конечные файлы.
Исходник статьи в формате org-mode доступен для скачивания: dotfiles.sorg.
Чем это лучше дотфайлов в git? Я вижу такие явные преимущества:
- Конфиги хорошо документированы в едином стиле;
- Наличие метаконфига, задающего общие константы между конфигами, и в то же время позволяющего задавать разные параметры между разными десктопами.
Моя публичная конфигурация для Emacs находится здесь. Но там разброд и шатание, пока не могу рекомендовать в качестве образца.
Преамбула, конфиг для конфигов
Есть набор параметров, которые подставляются макросами во все конфиги. Задаются примерно так:
* Моё имя
#+name: person-name
#+BEGIN_SRC text
Evgenii Lepikhin
#+END_SRC
* Имя пользователя в системе
#+name: system-username
#+BEGIN_SRC text
eugene
#+END_SRC
* E-mail
#+name: person-email
#+BEGIN_SRC text
johnlepikhin@gmail.com
#+END_SRC
* Батарейка в ~/sys/class/power_supply~
#+name: sys-power-supply
#+BEGIN_SRC
BAT1
#+END_SRC
* Ширина экрана
#+name: screen-width
#+BEGIN_SRC text
1600
#+END_SRC
* Каким светодиодом показывать альтернативную раскладку
#+name: kbd-layout-led
#+BEGIN_SRC text
caps
#+END_SRC
Этот конфиг следует вручную сохранить в файл ~/.dotfiles.conf.org. К Emacs он подключен через Library Of Babel:
(org-babel-lob-ingest "~/.dotfiles.conf.org")
bashrc
Конфиг подключается прописыванием в .bashrc строчки:
. ~/.bashrc.d/00_public
настройки XIM
export XMODIFIERS=@im=none
export GTK_IM_MODULE=none
export QT_IM_MODULE=none
export QT4_IM_MODULE=none
Настройки редактора
export EDITOR='emacsclient -c'
Упрощаем шелл
export PATH=~/bin:~/bin/phone-shared:$PATH
alias usetmp=USETMP_DIR\=\`mktemp\ -d\ /tmp/tmpdir-XXXX\`\;\ bash\ -c\ \"cd\ \$USETMP_DIR\;\ bash\"\;\ rmdir\ \$USETMP_DIR
Костыли от языка Go
export GOROOT=$HOME/bin/go
export GOPATH=$HOME/work/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
Костыли от языка Perl
PATH="$HOME/perl5/bin${PATH:+:${PATH}}"; export PATH;
PERL5LIB="$HOME/perl5/lib/perl5${PERL5LIB:+:${PERL5LIB}}"; export PERL5LIB;
PERL_LOCAL_LIB_ROOT="$HOME/perl5${PERL_LOCAL_LIB_ROOT:+:${PERL_LOCAL_LIB_ROOT}}"; export PERL_LOCAL_LIB_ROOT;
PERL_MB_OPT="--install_base \"$HOME/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=$HOME/perl5"; export PERL_MM_OPT;
Правильное от языка Ocaml
eval `opam config env`
git-grep-blame
Функция для bash, которая грепает и блеймит найденные строчки.
git-grep-blame() {
git grep -n "$1" | while IFS=: read i j k; do
git blame -w -f -L $j,$j $i
done
}
GNU global / gtags
export GTAGSLABEL=pygments
emacs
emacsclient.desktop
[Desktop Entry]
Name=Emacsclient
Exec=emacsclient -c %u
Icon=emacs-icon
Type=Application
Terminal=false
MimeType=x-scheme-handler/org-protocol
git
Основной конфиг
[user]
name = Evgenii Lepikhin
email = johnlepikhin@gmail.com
[core]
quotePath = false
autocrlf = input
excludesfile = ~/.gitignore
Глобальный .gitignore
*_flymake.pl
*_flymake.pm
.PerlySenseProject
TAGS
CTAGS
GTAGS
*.elc
flycheck_*.el
tramp
\#*\#
.\#*
*~
gradlew.bat
perltidy.ERR
globalrc
default:\
:tc=native:
native:\
:tc=gtags:tc=htags:
user:\
:tc=user-custom:tc=htags:
ctags:\
:tc=exuberant-ctags:tc=htags:
new-ctags:\
:tc=universal-ctags:tc=htags:
pygments:\
:tc=pygments-parser:tc=htags:
#---------------------------------------------------------------------
# Configuration for gtags(1)
# See gtags(1).
#---------------------------------------------------------------------
common:\
:skip=HTML/,HTML.pub/,tags,TAGS,ID,y.tab.c,y.tab.h,gtags.files,cscope.files,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,*.orig,*.rej,*.bak,*~,#*#,*.swp,*.tmp,*_flymake.*,*_flymake,*.o,*.a,*.so,*.lo,*.zip,*.gz,*.bz2,*.xz,*.lzh,*.Z,*.tgz,*.min.js,*min.css:
#
# Built-in parsers.
#
gtags:\
:tc=common:\
:tc=builtin-parser:
builtin-parser:\
:langmap=c\:.c.h,yacc\:.y,asm\:.s.S,java\:.java,cpp\:.c++.cc.hh.cpp.cxx.hxx.hpp.C.H,php\:.php.php3.phtml:
#
# skeleton for user's custom parser.
#
user-custom|User custom plugin parser:\
:tc=common:\
:langmap=c\:.c.h:\
:gtags_parser=c\:$libdir/gtags/user-custom.la:
#
# Plug-in parser to use Exuberant Ctags.
#
exuberant-ctags|plugin-example|setting to use Exuberant Ctags plug-in parser:\
:tc=common:\
:ctagscom=~/bin/ctags:\
:ctagslib=$libdir/gtags/exuberant-ctags.la:\
:tc=common-ctags-maps:
#
# A common map for both Exuberant Ctags and Universal Ctags.
# Don't include definitions of ctagscom and ctagslib in this entry.
#
common-ctags-maps:\
# Ant *.build.xml (out of support)
# Asm *.[68][68][kKsSxX] *.[xX][68][68] (out of support)
:langmap=Asm\:.asm.ASM.s.S.A51.29k.29K:\
:langmap=Asp\:.asp.asa:\
:langmap=Awk\:.awk.gawk.mawk:\
:langmap=Basic\:.bas.bi.bb.pb:\
:langmap=BETA\:.bet:\
:langmap=C\:.c:\
:langmap=C++\:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx:\
:langmap=C#\:.cs:\
:langmap=Cobol\:.cbl.cob.CBL.COB:\
:langmap=DosBatch\:.bat.cmd:\
:langmap=Eiffel\:.e:\
:langmap=Erlang\:.erl.ERL.hrl.HRL:\
:langmap=Flex\:.as.mxml:\
:langmap=Fortran\:.f.for.ftn.f77.f90.f95:\
:langmap=HTML\:.htm.html:\
:langmap=Java\:.java:\
:langmap=JavaScript\:.js:\
:langmap=Lisp\:.cl.clisp.el.l.lisp.lsp:\
:langmap=Lua\:.lua:\
# Make [Mm]akefile GNUmakefile (out of support)
:langmap=Make\:.mak.mk:\
:langmap=MatLab\:.m:\
:langmap=OCaml\:.ml.mli:\
:langmap=Pascal\:.p.pas:\
:langmap=Perl\:.pl.pm.plx.perl:\
:langmap=PHP\:.php.php3.phtml:\
:langmap=Python\:.py.pyx.pxd.pxi.scons:\
:langmap=REXX\:.cmd.rexx.rx:\
:langmap=Ruby\:.rb.ruby:\
:langmap=Scheme\:.SCM.SM.sch.scheme.scm.sm:\
:langmap=Sh\:.sh.SH.bsh.bash.ksh.zsh:\
:langmap=SLang\:.sl:\
:langmap=SML\:.sml.sig:\
:langmap=SQL\:.sql:\
:langmap=Tcl\:.tcl.tk.wish.itcl:\
:langmap=Tex\:.tex:\
:langmap=Vera\:.vr.vri.vrh:\
:langmap=Verilog\:.v:\
:langmap=VHDL\:.vhdl.vhd:\
:langmap=Vim\:.vim:\
:langmap=YACC\:.y:\
:gtags_parser=Asm\:$ctagslib:\
:gtags_parser=Asp\:$ctagslib:\
:gtags_parser=Awk\:$ctagslib:\
:gtags_parser=Basic\:$ctagslib:\
:gtags_parser=BETA\:$ctagslib:\
:gtags_parser=C\:$ctagslib:\
:gtags_parser=C++\:$ctagslib:\
:gtags_parser=C#\:$ctagslib:\
:gtags_parser=Cobol\:$ctagslib:\
:gtags_parser=DosBatch\:$ctagslib:\
:gtags_parser=Eiffel\:$ctagslib:\
:gtags_parser=Erlang\:$ctagslib:\
:gtags_parser=Flex\:$ctagslib:\
:gtags_parser=Fortran\:$ctagslib:\
:gtags_parser=HTML\:$ctagslib:\
:gtags_parser=Java\:$ctagslib:\
:gtags_parser=JavaScript\:$ctagslib:\
:gtags_parser=Lisp\:$ctagslib:\
:gtags_parser=Lua\:$ctagslib:\
:gtags_parser=Make\:$ctagslib:\
:gtags_parser=MatLab\:$ctagslib:\
:gtags_parser=OCaml\:$ctagslib:\
:gtags_parser=Pascal\:$ctagslib:\
:gtags_parser=Perl\:$ctagslib:\
:gtags_parser=PHP\:$ctagslib:\
:gtags_parser=Python\:$ctagslib:\
:gtags_parser=REXX\:$ctagslib:\
:gtags_parser=Ruby\:$ctagslib:\
:gtags_parser=Scheme\:$ctagslib:\
:gtags_parser=Sh\:$ctagslib:\
:gtags_parser=SLang\:$ctagslib:\
:gtags_parser=SML\:$ctagslib:\
:gtags_parser=SQL\:$ctagslib:\
:gtags_parser=Tcl\:$ctagslib:\
:gtags_parser=Tex\:$ctagslib:\
:gtags_parser=Vera\:$ctagslib:\
:gtags_parser=Verilog\:$ctagslib:\
:gtags_parser=VHDL\:$ctagslib:\
:gtags_parser=Vim\:$ctagslib:\
:gtags_parser=YACC\:$ctagslib:
#
# Plug-in parser to use Universal Ctags.
#
universal-ctags|setting to use Universal Ctags plug-in parser:\
:tc=common:\
:ctagscom=:\
:ctagslib=$libdir/gtags/universal-ctags.la:\
:tc=common-ctags-maps:\
:langmap=Ada\:.adb.ads.Ada:\
# Please uncomment to use this entry.
# :langmap=Ant\:.xml:\
:langmap=Ant\:.ant:\
:langmap=Clojure\:.clj:\
:langmap=CoffeeScript\:.coffee:\
:langmap=C++\:.inl:\
:langmap=CSS\:.css:\
:langmap=ctags\:.ctags:\
:langmap=D\:.d.di:\
:langmap=Diff\:.diff.patch:\
:langmap=DTS\:.dts.dtsi:\
:langmap=Falcon\:.fal.ftd:\
:langmap=Fortran\:.f03.f08.f15:\
# gdbinit .gdbinit (out of support)
:langmap=gdbinit\:.gdb:\
:langmap=Go\:.go:\
:langmap=JSON\:.json:\
:langmap=m4\:.m4.spt:\
:langmap=ObjectiveC\:.mm.m.h:\
:langmap=OCaml\:.aug:\
:langmap=Perl\:.ph:\
:langmap=Perl6\:.p6.pm6.pm.pl6:\
:langmap=PHP\:.php4.php5.php7:\
:langmap=R\:.r.R.s.q:\
:langmap=reStructuredText\:.rest.reST.rst:\
:langmap=Rust\:.rs:\
:langmap=Sh\:.ash:\
:langmap=SystemVerilog\:.sv.svh.svi:\
# Vim vimrc [._]vimrc gvimrc [._]gvimrc (out of support)
:langmap=Vim\:.vba:\
:langmap=WindRes\:.rc:\
:langmap=Zephir\:.zep:\
# Please uncomment to use this entry.
# :langmap=DBusIntrospect\:.xml:\
# :langmap=Glade\:.glade:\
:gtags_parser=Ada\:$ctagslib:\
:gtags_parser=Ant\:$ctagslib:\
:gtags_parser=Clojure\:$ctagslib:\
:gtags_parser=CoffeeScript\:$ctagslib:\
:gtags_parser=CSS\:$ctagslib:\
:gtags_parser=ctags\:$ctagslib:\
:gtags_parser=D\:$ctagslib:\
:gtags_parser=Diff\:$ctagslib:\
:gtags_parser=DTS\:$ctagslib:\
:gtags_parser=Falcon\:$ctagslib:\
:gtags_parser=gdbinit\:$ctagslib:\
:gtags_parser=Go\:$ctagslib:\
:gtags_parser=JSON\:$ctagslib:\
:gtags_parser=m4\:$ctagslib:\
:gtags_parser=ObjectiveC\:$ctagslib:\
:gtags_parser=Perl6\:$ctagslib:\
:gtags_parser=R\:$ctagslib:\
:gtags_parser=reStructuredText\:$ctagslib:\
:gtags_parser=Rust\:$ctagslib:\
:gtags_parser=SystemVerilog\:$ctagslib:\
:gtags_parser=WindRes\:$ctagslib:\
:gtags_parser=Zephir\:$ctagslib:\
:gtags_parser=DBusIntrospect\:$ctagslib:\
:gtags_parser=Glade\:$ctagslib:
#
# Plug-in parser to use Pygments.
#
pygments-parser|Pygments plug-in parser:\
:ctagscom=/usr/bin/ctags:\
:pygmentslib=$libdir/gtags/pygments-parser.la:\
:tc=common:\
:langmap=ABAP\:.abap:\
:langmap=ANTLR\:.G.g:\
:langmap=ActionScript3\:.as:\
:langmap=Ada\:.adb.ads.ada:\
:langmap=AppleScript\:.applescript:\
:langmap=AspectJ\:.aj:\
:langmap=Aspx-cs\:.aspx.asax.ascx.ashx.asmx.axd:\
:langmap=Asymptote\:.asy:\
:langmap=AutoIt\:.au3:\
:langmap=Awk\:.awk.gawk.mawk:\
:langmap=BUGS\:.bug:\
:langmap=Bash\:.sh.ksh.bash.ebuild.eclass:\
:langmap=Bat\:.bat.cmd:\
:langmap=BlitzMax\:.bmx:\
:langmap=Boo\:.boo:\
:langmap=Bro\:.bro:\
:langmap=C#\:.cs:\
:langmap=C++\:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.C.H:\
:langmap=COBOLFree\:.cbl.CBL:\
:langmap=COBOL\:.cob.COB.cpy.CPY:\
:langmap=CUDA\:.cu.cuh:\
:langmap=C\:.c.h:\
:langmap=Ceylon\:.ceylon:\
:langmap=Cfm\:.cfm.cfml.cfc:\
:langmap=Clojure\:.clj:\
:langmap=CoffeeScript\:.coffee:\
:langmap=Common-Lisp\:.cl.lisp.el:\
:langmap=Coq\:.v:\
:langmap=Croc\:.croc:\
:langmap=Csh\:.tcsh.csh:\
:langmap=Cython\:.pyx.pxd.pxi:\
:langmap=Dart\:.dart:\
:langmap=Dg\:.dg:\
:langmap=Duel\:.duel.jbst:\
:langmap=Dylan\:.dylan.dyl.intr:\
:langmap=ECL\:.ecl:\
:langmap=EC\:.ec.eh:\
:langmap=ERB\:.erb:\
:langmap=Elixir\:.ex.exs:\
:langmap=Erlang\:.erl.hrl.es.escript:\
:langmap=Evoque\:.evoque:\
:langmap=FSharp\:.fs.fsi:\
:langmap=Factor\:.factor:\
:langmap=Fancy\:.fy.fancypack:\
:langmap=Fantom\:.fan:\
:langmap=Felix\:.flx.flxh:\
:langmap=Fortran\:.f.f90.F.F90:\
:langmap=GAS\:.s.S:\
:langmap=GLSL\:.vert.frag.geo:\
:langmap=Genshi\:.kid:\
:langmap=Gherkin\:.feature:\
:langmap=Gnuplot\:.plot.plt:\
:langmap=Go\:.go:\
:langmap=GoodData-CL\:.gdc:\
:langmap=Gosu\:.gs.gsx.gsp.vark:\
:langmap=Groovy\:.groovy:\
:langmap=Gst\:.gst:\
:langmap=HaXe\:.hx:\
:langmap=Haml\:.haml:\
:langmap=Haskell\:.hs:\
:langmap=Hxml\:.hxml:\
:langmap=Hybris\:.hy.hyb:\
:langmap=IDL\:.pro:\
:langmap=Io\:.io:\
:langmap=Ioke\:.ik:\
:langmap=JAGS\:.jag.bug:\
:langmap=Jade\:.jade:\
:langmap=JavaScript\:.js:\
:langmap=Java\:.java:\
:langmap=Jsp\:.jsp:\
:langmap=Julia\:.jl:\
:langmap=Koka\:.kk.kki:\
:langmap=Kotlin\:.kt:\
:langmap=LLVM\:.ll:\
:langmap=Lasso\:.lasso:\
:langmap=Literate-Haskell\:.lhs:\
:langmap=LiveScript\:.ls:\
:langmap=Logos\:.x.xi.xm.xmi:\
:langmap=Logtalk\:.lgt:\
:langmap=Lua\:.lua.wlua:\
:langmap=MOOCode\:.moo:\
:langmap=MXML\:.mxml:\
:langmap=Mako\:.mao:\
:langmap=Mason\:.m.mhtml.mc.mi:\
:langmap=Matlab\:.m:\
:langmap=Modelica\:.mo:\
:langmap=Modula2\:.mod:\
:langmap=Monkey\:.monkey:\
:langmap=MoonScript\:.moon:\
:langmap=MuPAD\:.mu:\
:langmap=Myghty\:.myt:\
:langmap=NASM\:.asm.ASM:\
:langmap=NSIS\:.nsi.nsh:\
:langmap=Nemerle\:.n:\
:langmap=NewLisp\:.lsp.nl:\
:langmap=Newspeak\:.ns2:\
:langmap=Nimrod\:.nim.nimrod:\
:langmap=OCaml\:.ml.mli.mll.mly:\
:langmap=Objective-C++\:.mm.hh:\
:langmap=Objective-C\:.m.h:\
:langmap=Objective-J\:.j:\
:langmap=Octave\:.m:\
:langmap=Ooc\:.ooc:\
:langmap=Opa\:.opa:\
:langmap=OpenEdge\:.p.cls:\
:langmap=PHP\:.php.php3.phtml:\
:langmap=Pascal\:.pas:\
:langmap=Perl\:.pl.pm:\
:langmap=PostScript\:.ps.eps:\
:langmap=PowerShell\:.ps1:\
:langmap=Prolog\:.prolog.pro.pl:\
:langmap=Python\:.py.pyw.sc.tac.sage:\
:langmap=QML\:.qml:\
:langmap=REBOL\:.r.r3:\
:langmap=RHTML\:.rhtml:\
:langmap=Racket\:.rkt.rktl:\
:langmap=Ragel\:.rl:\
:langmap=Redcode\:.cw:\
:langmap=RobotFramework\:.robot:\
:langmap=Ruby\:.rb.rbw.rake.gemspec.rbx.duby:\
:langmap=Rust\:.rs.rc:\
:langmap=S\:.S.R:\
:langmap=Scala\:.scala:\
:langmap=Scaml\:.scaml:\
:langmap=Scheme\:.scm.ss:\
:langmap=Scilab\:.sci.sce.tst:\
:langmap=Smalltalk\:.st:\
:langmap=Smarty\:.tpl:\
:langmap=Sml\:.sml.sig.fun:\
:langmap=Snobol\:.snobol:\
:langmap=SourcePawn\:.sp:\
:langmap=Spitfire\:.spt:\
:langmap=Ssp\:.ssp:\
:langmap=Stan\:.stan:\
:langmap=SystemVerilog\:.sv.svh:\
:langmap=Tcl\:.tcl:\
:langmap=TeX\:.tex.aux.toc:\
:langmap=Tea\:.tea:\
:langmap=Treetop\:.treetop.tt:\
:langmap=TypeScript\:.ts:\
:langmap=UrbiScript\:.u:\
:langmap=VB.net\:.vb.bas:\
:langmap=VGL\:.rpf:\
:langmap=Vala\:.vala.vapi:\
:langmap=Velocity\:.vm.fhtml:\
:langmap=Verilog\:.v:\
:langmap=Vhdl\:.vhdl.vhd:\
:langmap=Vim\:.vim:\
:langmap=XBase\:.PRG.prg:\
:langmap=XQuery\:.xqy.xquery.xq.xql.xqm:\
:langmap=XSLT\:.xsl.xslt.xpl:\
:langmap=Xtend\:.xtend:\
:gtags_parser=ABAP\:$pygmentslib:\
:gtags_parser=ANTLR\:$pygmentslib:\
:gtags_parser=ActionScript3\:$pygmentslib:\
:gtags_parser=Ada\:$pygmentslib:\
:gtags_parser=AppleScript\:$pygmentslib:\
:gtags_parser=AspectJ\:$pygmentslib:\
:gtags_parser=Aspx-cs\:$pygmentslib:\
:gtags_parser=Asymptote\:$pygmentslib:\
:gtags_parser=AutoIt\:$pygmentslib:\
:gtags_parser=Awk\:$pygmentslib:\
:gtags_parser=BUGS\:$pygmentslib:\
:gtags_parser=Bash\:$pygmentslib:\
:gtags_parser=Bat\:$pygmentslib:\
:gtags_parser=BlitzMax\:$pygmentslib:\
:gtags_parser=Boo\:$pygmentslib:\
:gtags_parser=Bro\:$pygmentslib:\
:gtags_parser=C#\:$pygmentslib:\
:gtags_parser=C++\:$pygmentslib:\
:gtags_parser=COBOLFree\:$pygmentslib:\
:gtags_parser=COBOL\:$pygmentslib:\
:gtags_parser=CUDA\:$pygmentslib:\
:gtags_parser=C\:$pygmentslib:\
:gtags_parser=Ceylon\:$pygmentslib:\
:gtags_parser=Cfm\:$pygmentslib:\
:gtags_parser=Clojure\:$pygmentslib:\
:gtags_parser=CoffeeScript\:$pygmentslib:\
:gtags_parser=Common-Lisp\:$pygmentslib:\
:gtags_parser=Coq\:$pygmentslib:\
:gtags_parser=Croc\:$pygmentslib:\
:gtags_parser=Csh\:$pygmentslib:\
:gtags_parser=Cython\:$pygmentslib:\
:gtags_parser=Dart\:$pygmentslib:\
:gtags_parser=Dg\:$pygmentslib:\
:gtags_parser=Duel\:$pygmentslib:\
:gtags_parser=Dylan\:$pygmentslib:\
:gtags_parser=ECL\:$pygmentslib:\
:gtags_parser=EC\:$pygmentslib:\
:gtags_parser=ERB\:$pygmentslib:\
:gtags_parser=Elixir\:$pygmentslib:\
:gtags_parser=Erlang\:$pygmentslib:\
:gtags_parser=Evoque\:$pygmentslib:\
:gtags_parser=FSharp\:$pygmentslib:\
:gtags_parser=Factor\:$pygmentslib:\
:gtags_parser=Fancy\:$pygmentslib:\
:gtags_parser=Fantom\:$pygmentslib:\
:gtags_parser=Felix\:$pygmentslib:\
:gtags_parser=Fortran\:$pygmentslib:\
:gtags_parser=GAS\:$pygmentslib:\
:gtags_parser=GLSL\:$pygmentslib:\
:gtags_parser=Genshi\:$pygmentslib:\
:gtags_parser=Gherkin\:$pygmentslib:\
:gtags_parser=Gnuplot\:$pygmentslib:\
:gtags_parser=Go\:$pygmentslib:\
:gtags_parser=GoodData-CL\:$pygmentslib:\
:gtags_parser=Gosu\:$pygmentslib:\
:gtags_parser=Groovy\:$pygmentslib:\
:gtags_parser=Gst\:$pygmentslib:\
:gtags_parser=HaXe\:$pygmentslib:\
:gtags_parser=Haml\:$pygmentslib:\
:gtags_parser=Haskell\:$pygmentslib:\
:gtags_parser=Hxml\:$pygmentslib:\
:gtags_parser=Hybris\:$pygmentslib:\
:gtags_parser=IDL\:$pygmentslib:\
:gtags_parser=Io\:$pygmentslib:\
:gtags_parser=Ioke\:$pygmentslib:\
:gtags_parser=JAGS\:$pygmentslib:\
:gtags_parser=Jade\:$pygmentslib:\
:gtags_parser=JavaScript\:$pygmentslib:\
:gtags_parser=Java\:$pygmentslib:\
:gtags_parser=Jsp\:$pygmentslib:\
:gtags_parser=Julia\:$pygmentslib:\
:gtags_parser=Koka\:$pygmentslib:\
:gtags_parser=Kotlin\:$pygmentslib:\
:gtags_parser=LLVM\:$pygmentslib:\
:gtags_parser=Lasso\:$pygmentslib:\
:gtags_parser=Literate-Haskell\:$pygmentslib:\
:gtags_parser=LiveScript\:$pygmentslib:\
:gtags_parser=Logos\:$pygmentslib:\
:gtags_parser=Logtalk\:$pygmentslib:\
:gtags_parser=Lua\:$pygmentslib:\
:gtags_parser=MAQL\:$pygmentslib:\
:gtags_parser=MOOCode\:$pygmentslib:\
:gtags_parser=MXML\:$pygmentslib:\
:gtags_parser=Mako\:$pygmentslib:\
:gtags_parser=Mason\:$pygmentslib:\
:gtags_parser=Matlab\:$pygmentslib:\
:gtags_parser=MiniD\:$pygmentslib:\
:gtags_parser=Modelica\:$pygmentslib:\
:gtags_parser=Modula2\:$pygmentslib:\
:gtags_parser=Monkey\:$pygmentslib:\
:gtags_parser=MoonScript\:$pygmentslib:\
:gtags_parser=MuPAD\:$pygmentslib:\
:gtags_parser=Myghty\:$pygmentslib:\
:gtags_parser=NASM\:$pygmentslib:\
:gtags_parser=NSIS\:$pygmentslib:\
:gtags_parser=Nemerle\:$pygmentslib:\
:gtags_parser=NewLisp\:$pygmentslib:\
:gtags_parser=Newspeak\:$pygmentslib:\
:gtags_parser=Nimrod\:$pygmentslib:\
:gtags_parser=OCaml\:$pygmentslib:\
:gtags_parser=Objective-C++\:$pygmentslib:\
:gtags_parser=Objective-C\:$pygmentslib:\
:gtags_parser=Objective-J\:$pygmentslib:\
:gtags_parser=Octave\:$pygmentslib:\
:gtags_parser=Ooc\:$pygmentslib:\
:gtags_parser=Opa\:$pygmentslib:\
:gtags_parser=OpenEdge\:$pygmentslib:\
:gtags_parser=PHP\:$pygmentslib:\
:gtags_parser=Pascal\:$pygmentslib:\
:gtags_parser=Perl\:$pygmentslib:\
:gtags_parser=PostScript\:$pygmentslib:\
:gtags_parser=PowerShell\:$pygmentslib:\
:gtags_parser=Prolog\:$pygmentslib:\
:gtags_parser=Python\:$pygmentslib:\
:gtags_parser=QML\:$pygmentslib:\
:gtags_parser=REBOL\:$pygmentslib:\
:gtags_parser=RHTML\:$pygmentslib:\
:gtags_parser=Racket\:$pygmentslib:\
:gtags_parser=Ragel\:$pygmentslib:\
:gtags_parser=Redcode\:$pygmentslib:\
:gtags_parser=RobotFramework\:$pygmentslib:\
:gtags_parser=Ruby\:$pygmentslib:\
:gtags_parser=Rust\:$pygmentslib:\
:gtags_parser=S\:$pygmentslib:\
:gtags_parser=Scala\:$pygmentslib:\
:gtags_parser=Scaml\:$pygmentslib:\
:gtags_parser=Scheme\:$pygmentslib:\
:gtags_parser=Scilab\:$pygmentslib:\
:gtags_parser=Smalltalk\:$pygmentslib:\
:gtags_parser=Smarty\:$pygmentslib:\
:gtags_parser=Sml\:$pygmentslib:\
:gtags_parser=Snobol\:$pygmentslib:\
:gtags_parser=SourcePawn\:$pygmentslib:\
:gtags_parser=Spitfire\:$pygmentslib:\
:gtags_parser=Ssp\:$pygmentslib:\
:gtags_parser=Stan\:$pygmentslib:\
:gtags_parser=SystemVerilog\:$pygmentslib:\
:gtags_parser=Tcl\:$pygmentslib:\
:gtags_parser=TeX\:$pygmentslib:\
:gtags_parser=Tea\:$pygmentslib:\
:gtags_parser=Treetop\:$pygmentslib:\
:gtags_parser=TypeScript\:$pygmentslib:\
:gtags_parser=UrbiScript\:$pygmentslib:\
:gtags_parser=VB.net\:$pygmentslib:\
:gtags_parser=VGL\:$pygmentslib:\
:gtags_parser=Vala\:$pygmentslib:\
:gtags_parser=Velocity\:$pygmentslib:\
:gtags_parser=Verilog\:$pygmentslib:\
:gtags_parser=Vhdl\:$pygmentslib:\
:gtags_parser=Vim\:$pygmentslib:\
:gtags_parser=XBase\:$pygmentslib:\
:gtags_parser=XQuery\:$pygmentslib:\
:gtags_parser=XSLT\:$pygmentslib:\
:gtags_parser=Xtend\:$pygmentslib:
#
# Drupal configuration.
#
drupal|Drupal content management platform:\
:tc=common:\
:langmap=php\:.php.module.inc.profile.install.test:
#---------------------------------------------------------------------
# Configuration for htags(1)
#---------------------------------------------------------------------
htags:\
::
inputrc
По Ctrl-B удалять назад до ближайшего пробела или слэша.
C-b: unix-filename-rubout
Ctrl-left и ctrl-right для движения по словам
"\e[1;5C": forward-word
"\e[1;5D": backward-word
mimeapps.list
[Default Applications]
x-scheme-handler/icq=icqdesktop.desktop
text/html=google-chrome.desktop
x-scheme-handler/http=google-chrome.desktop
x-scheme-handler/https=google-chrome.desktop
x-scheme-handler/about=google-chrome.desktop
x-scheme-handler/unknown=google-chrome.desktop
video/mp4=smplayer.desktop
x-scheme-handler/tg=telegramdesktop.desktop
x-scheme-handler/magnet=qBittorrent.desktop
x-scheme-handler/org-protocol=emacsclient.desktop
После этого надо позвать update-desktop-database ~/.local/share/applications/
parcellite
Менеджер буфера обмена.
[rc]
RCVersion=1
use_copy=true
use_primary=true
synchronize=true
save_history=true
history_pos=false
history_x=1
history_y=1
history_limit=25
data_size=0
item_size=5
automatic_paste=false
auto_key=false
auto_mouse=true
key_input=false
restore_empty=true
rc_edit=true
type_search=true
case_search=false
ignore_whiteonly=false
trim_wspace_begend=false
trim_newline=false
hyperlinks_only=false
confirm_clear=true
current_on_top=true
single_line=true
reverse_history=false
item_length=50
persistent_history=false
persistent_separate=false
persistent_on_top=false
persistent_delim=\\n
nonprint_disp=false
ellipsize=2
multi_user=false
icon_name=parcellite
menu_key=<Ctrl><Alt>P
history_key=<Ctrl><Super>C
phistory_key=<Ctrl><Alt>X
actions_key=
perlcritic
severity = 1
theme = bugs + maintenance + security + complexity + pbp + cosmetic + core
#This one must be disabled, since flymake will create temp files which
#by definition never match the specified package name
[-Modules::RequireFilenameMatchesPackage]
[-Subroutines::ProhibitSubroutinePrototypes]
[-Subroutines::ProhibitExplicitReturnUndef]
[-Subroutines::RequireArgUnpacking]
[-InputOutput::RequireCheckedSyscalls]
[-ValuesAndExpressions::ProhibitInterpolationOfLiterals]
[-ValuesAndExpressions::ProhibitMagicNumbers]
[-RegularExpressions::RequireDotMatchAnything]
[-RegularExpressions::RequireExtendedFormatting]
[-RegularExpressions::RequireLineBoundaryMatching]
[-Modules::RequireVersionVar]
[-Modules::ProhibitMultiplePackages]
[-RegularExpressions::ProhibitComplexRegexes]
[-ValuesAndExpressions::ProhibitLongChainsOfMethodCalls]
[-InputOutput::RequireCheckedClose]
[-Variables::ProhibitPunctuationVars]
[-ControlStructures::ProhibitDeepNests]
[-Documentation::RequirePodAtEnd]
[-Documentation::RequirePodSections]
[-Documentation::PodSpelling]
[InputOutput::RequireBriefOpen]
lines = 20
perltidy
# Max line width is 78 cols
-l=140
# Indent level is 4 cols
-i=4
# Continuation indent is 4 cols
-ci=4
# Output to STDOUT
-st
# Errors to STDERR
-se
# Maximal vertical tightness
-vt=2
# No extra indentation for closing brackets
-cti=0
# Medium parenthesis tightness
-pt=1
# Medium brace tightness
-bt=1
# Medium square bracket tightness
-sbt=1
# Medium block brace tightness
-bbt=1
# No space before semicolons
-nsfs
# Don't outdent long quoted strings
-nolq
# Break before all operators
-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
# No newline before else
-ce
-bar
-otr
-sct
-dnl
-wrs='! ++'
ssh
Базовая конфигурация для нижеследующих хостов
Включить сжатие по умолчанию
Host *
Compression yes
CompressionLevel 9
Таймауты
Host *
ServerAliveInterval 10
ConnectTimeout 15
Постоянные соединения
Host *
ControlMaster auto
ControlPath ~/.ssh/connections/%h:%p:%r
ControlPersist yes
Значения по умолчанию для неизвестных хостов
Host *
User root
stalonetray
Предварительные вычисления
Я хочу всегда рапологать трей на 670 пикселей левее правого края экрана:
(- 1600 670)
Конфиг
decorations none
transparent false
dockapp_mode none
geometry 10x1+nil+0
max_geometry 5x1-325-10
background "#000000"
kludges force_icons_size
grow_gravity NE
icon_gravity NE
icon_size 16
slot_size 22
sticky true
window_type dock
window_layer bottom
#no_shrink false
skip_taskbar true
urxvt
Кусочки моего кода
Заголовок
use File::Temp;
sub msg {
my ( $self, $msg ) = @_;
$self->{overlay} =
$self->overlay( 0, -1, $self->ncol, 2, urxvt::OVERLAY_RSTYLE, 0 );
$self->{overlay}->set( 0, 0, $msg );
}
sub on_start {
my $self = shift;
$self->bind_action( "M-e" => '%:edit_screen' );
}
Открытие истории консоли во внешнем редакторе по Meta-E
sub edit_screen {
my $self = shift;
my $history = q{};
my $row = $self->top_row;
while ( $self->nrow > $row ) {
my $line = $self->line($row);
$history .= $line->t() . "\n";
$row++;
}
my $fh = File::Temp->new( TEMPLATE => '/tmp/urxvt_edit_screen_XXXXXX' );
binmode( $fh, ":utf8" );
print $fh $history;
system('editor', $fh->filename);
close $fh;
}
sub on_action {
my $self = shift;
my $action = shift;
if ( $action eq 'edit_screen' ) {
edit_screen($self);
}
}
Просить подтверждение при попытке вставить многострочный текст
sub on_tt_paste {
my ( $self, $str ) = @_;
$str =~
s/\xc2[«»]|\xe2\x80[\xb9\xba\x9e\x9c\x9d]|\xe3\x80[\x8c-\x8f]/"/gs;
my $count = ( $str =~ tr/\012\015// );
if ( !$count ) {
$self->tt_paste($str);
return 1;
}
$self->{paste} = \$str;
$self->msg("Paste of $count lines, continue? (y/n)");
my $preview = substr $self->locale_decode($str), 0, $self->ncol;
$preview =~ s/\n/\\n/g;
$self->{overlay}->set( 0, 1, $self->special_encode($preview) );
$self->enable( key_press => \&tt_key_press );
1;
}
sub tt_leave {
my ($self) = @_;
$self->{paste} = undef;
delete $self->{overlay};
$self->disable("key_press");
}
sub tt_key_press {
my ( $self, $event, $keysym, $string ) = @_;
if ( $keysym == 121 ) { # y
$self->tt_paste( ${ $self->{paste} } );
$self->tt_leave;
}
elsif ( $keysym == 110 ) { # n
$self->tt_leave;
}
1;
}
Смена размера шрифта по Ctrl-Up/Down
Кнопки настроены через Xresources
use strict;
use warnings;
my %escapecodes = (
"font" => 710,
"boldFont" => 711,
"italicFont" => 712,
"boldItalicFont" => 713
);
sub on_start
{
my ($self) = @_;
$self->{step} = $self->x_resource("%.step") || 1;
foreach my $type (qw(font boldFont italicFont boldItalicFont)) {
$self->{$type} = $self->x_resource($type) || "undef";
}
}
sub on_user_command
{
my ($self, $cmd) = @_;
my $step = $self->{step};
if ($cmd eq "font-size:increase") {
fonts_change_size($self, $step, 0);
} elsif ($cmd eq "font-size:decrease") {
fonts_change_size($self, -$step, 0);
} elsif ($cmd eq "font-size:incglobal") {
fonts_change_size($self, $step, 1);
} elsif ($cmd eq "font-size:decglobal") {
fonts_change_size($self, -$step, 1);
} elsif ($cmd eq "font-size:incsave") {
fonts_change_size($self, $step, 2);
} elsif ($cmd eq "font-size:decsave") {
fonts_change_size($self, -$step, 2);
} elsif ($cmd eq "font-size:reset") {
fonts_reset($self);
}
}
sub fonts_change_size
{
my ($term, $change, $save) = @_;
my @newfonts = ();
my $curres = $term->resource('font');
if (!$curres) {
$term->scr_add_lines("\r\nWarning: No font configured, trying a default.\r\nPlease set a font with the 'URxvt.font' resource.");
$curres = "fixed";
}
my @curfonts = split(/,/, $curres);
my $basefont = shift(@curfonts);
my ($newbasefont, $newbasesize) = handle_font($term, $basefont, $change, 0);
push @newfonts, $newbasefont;
# Only adjust other fonts if base font changed
if ($newbasefont ne $basefont) {
foreach my $font (@curfonts) {
my ($newfont, $newsize) = handle_font($term, $font, $change, $newbasesize);
push @newfonts, $newfont;
}
my $newres = join(",", @newfonts);
font_apply_new($term, $newres, "font", $save);
handle_type($term, "boldFont", $change, $newbasesize, $save);
handle_type($term, "italicFont", $change, $newbasesize, $save);
handle_type($term, "boldItalicFont", $change, $newbasesize, $save);
}
if ($save > 1) {
# write the new values back to the file
my $xresources = readlink $ENV{"HOME"} . "/.Xresources";
system("xrdb -edit " . $xresources);
}
}
sub fonts_reset
{
my ($term) = @_;
foreach my $type (qw(font boldFont italicFont boldItalicFont)) {
my $initial = $term->{$type};
if ($initial ne "undef") {
font_apply_new($term, $initial, $type, 0);
}
}
}
sub handle_type
{
my ($term, $type, $change, $basesize, $save) = @_;
my $curres = $term->resource($type);
if (!$curres) {
return;
}
my @curfonts = split(/,/, $curres);
my @newfonts = ();
foreach my $font (@curfonts) {
my ($newfont, $newsize) = handle_font($term, $font, $change, $basesize);
push @newfonts, $newfont;
}
my $newres = join(",", @newfonts);
font_apply_new($term, $newres, $type, $save);
}
sub handle_font
{
my ($term, $font, $change, $basesize) = @_;
my $newfont;
my $newsize;
my $prefix = 0;
if ($font =~ /^\s*x:/) {
$font =~ s/^\s*x://;
$prefix = 1;
}
if ($font =~ /^\s*(\[.*\])?xft:/) {
($newfont, $newsize) = font_change_size_xft($term, $font, $change, $basesize);
} elsif ($font =~ /^\s*-/) {
($newfont, $newsize) = font_change_size_xlfd($term, $font, $change, $basesize);
} else {
# check whether the font is a valid alias and if yes resolve it to the
# actual font
my $lsfinfo = `xlsfonts -l $font 2>/dev/null`;
if ($lsfinfo eq "") {
# not a valid alias, ring the bell if it is the base font and just
# return the current font
if ($basesize == 0) {
$term->scr_bell;
}
return ($font, $basesize);
}
my $fontinfo = (split(/\n/, $lsfinfo))[-1];
my ($fontfull) = ($fontinfo =~ /\s+([-a-z0-9]+$)/);
($newfont, $newsize) = font_change_size_xlfd($term, $fontfull, $change, $basesize);
}
# $term->scr_add_lines("\r\nNew font is $newfont\n");
if ($prefix) {
$newfont = "x:$newfont";
}
return ($newfont, $newsize);
}
sub font_change_size_xft
{
my ($term, $fontstring, $change, $basesize) = @_;
my @pieces = split(/:/, $fontstring);
my @resized = ();
my $size = 0;
my $new_size = 0;
foreach my $piece (@pieces) {
if ($piece =~ /^(?:(?:pixel)?size=|[^=-]+-)(\d+(\.\d*)?)$/) {
$size = $1;
if ($basesize != 0) {
$new_size = $basesize;
} else {
$new_size = $size + $change
}
$piece =~ s/(=|-)$size/$1$new_size/;
}
push @resized, $piece;
}
my $resized_str = join(":", @resized);
# don't make fonts too small
if ($new_size >= 6) {
return ($resized_str, $new_size);
} else {
if ($basesize == 0) {
$term->scr_bell;
}
return ($fontstring, $size);
}
}
sub font_change_size_xlfd
{
my ($term, $fontstring, $change, $basesize) = @_;
#-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-1
my @fields = qw(foundry family weight slant setwidth style pixelSize pointSize Xresolution Yresolution spacing averageWidth registry encoding);
my %font;
$fontstring =~ s/^-//; # Strip leading - before split
@font{@fields} = split(/-/, $fontstring);
if ($font{pixelSize} eq '*') {
$term->scr_add_lines("\r\nWarning: Font size undefined, assuming 12.\r\nPlease set the 'URxvt.font' resource to a font with a concrete size.");
$font{pixelSize} = '12'
}
if ($font{registry} eq '*') {
$font{registry} ='iso8859';
}
# Blank out the size for the pattern
my %pattern = %font;
$pattern{foundry} = '*';
$pattern{setwidth} = '*';
$pattern{pixelSize} = '*';
$pattern{pointSize} = '*';
# if ($basesize != 0) {
# $pattern{Xresolution} = '*';
# $pattern{Yresolution} = '*';
# }
$pattern{averageWidth} = '*';
# make sure there are no empty fields
foreach my $field (@fields) {
$pattern{$field} = '*' unless defined($pattern{$field});
}
my $new_fontstring = '-' . join('-', @pattern{@fields});
my @possible;
# $term->scr_add_lines("\r\nPattern is $new_fontstring\n");
open(FOO, "xlsfonts -fn '$new_fontstring' | sort -u |") or die $!;
while (<FOO>) {
chomp;
s/^-//; # Strip leading '-' before split
my @fontdata = split(/-/, $_);
push @possible, [$fontdata[6], "-$_"];
# $term->scr_add_lines("\r\npossibly $fontdata[6] $_\n");
}
close(FOO);
if (!@possible) {
die "No possible fonts!";
}
if ($basesize != 0) {
# sort by font size, descending
@possible = sort {$b->[0] <=> $a->[0]} @possible;
# font is not the base font, so find the largest font that is at most
# as large as the base font. If the largest possible font is smaller
# than the base font bail and hope that a 0-size font can be found at
# the end of the function
if ($possible[0]->[0] > $basesize) {
foreach my $candidate (@possible) {
if ($candidate->[0] <= $basesize) {
return ($candidate->[1], $candidate->[0]);
}
}
}
} elsif ($change > 0) {
# sort by font size, ascending
@possible = sort {$a->[0] <=> $b->[0]} @possible;
foreach my $candidate (@possible) {
if ($candidate->[0] >= $font{pixelSize} + $change) {
return ($candidate->[1], $candidate->[0]);
}
}
} elsif ($change < 0) {
# sort by font size, descending
@possible = sort {$b->[0] <=> $a->[0]} @possible;
foreach my $candidate (@possible) {
if ($candidate->[0] <= $font{pixelSize} + $change && $candidate->[0] != 0) {
return ($candidate->[1], $candidate->[0]);
}
}
}
# no fitting font available, check whether a 0-size font can be used to
# fit the size of the base font
@possible = sort {$a->[0] <=> $b->[0]} @possible;
if ($basesize != 0 && $possible[0]->[0] == 0) {
return ($possible[0]->[1], $basesize);
} else {
# if there is absolutely no smaller/larger font that can be used
# return the current one, and beep if this is the base font
if ($basesize == 0) {
$term->scr_bell;
}
return ("-$fontstring", $font{pixelSize});
}
}
sub font_apply_new
{
my ($term, $newfont, $type, $save) = @_;
# $term->scr_add_lines("\r\nnew font is $newfont\n");
$term->cmd_parse("\033]" . $escapecodes{$type} . ";" . $newfont . "\033\\");
# load the xrdb db
# system("xrdb -load " . X_RESOURCES);
if ($save > 0) {
# merge the new values
open(XRDB_MERGE, "| xrdb -merge") || die "can't fork: $!";
local $SIG{PIPE} = sub { die "xrdb pipe broken" };
print XRDB_MERGE "URxvt." . $type . ": " . $newfont;
close(XRDB_MERGE) || die "bad xrdb: $! $?";
}
}
vim
set nowrapscan
set ch=2
map <S-Insert> <MiddleMouse>
map! <S-Insert> <MiddleMouse>
set viminfo=\'1000,f1,<500,/50
au BufNewFile,BufRead *.eliom set filetype=ocaml
let c_comment_strings=1
syntax on
set hlsearch
set tags=./TAGS
"set mouse=a
set cindent
set smartindent
set autoindent
"set expandtab
set tabstop=3
set shiftwidth=3
set pastetoggle=<F10>
map ё `
map й q
map ц w
map у e
map к r
map е t
map н y
map г u
map ш i
map щ o
map з p
map х [
map ъ ]
map ф a
map ы s
map в d
map а f
map п g
map р h
map о j
map л k
map д l
map ж ;
map я z
map ч x
map с c
map м v
map и b
map т n
map ь m
map б ,
map ю .
map Ё ~
map Й Q
map Ц W
map У E
map К R
map Е T
map Н Y
map Г U
map Ш I
map Щ O
map З P
map Х {
map Ъ }
map Ф A
map Ы S
map В D
map А F
map П G
map Р H
map О J
map Л K
map Д L
map Ж :
map Э "
map Я Z
map Ч X
map С C
map М V
map И B
map Т N
map Ь M
map Б <
map Ю >
map . /
Конфигурация для OPAM/Ocaml
" ## added by OPAM user-setup for vim / base ## 93ee63e278bdfc07d1139a748ed3fff2 ## you can edit, but keep this line
let s:opam_share_dir = system("opam config var share")
let s:opam_share_dir = substitute(s:opam_share_dir, '[\r\n]*$', '', '')
let s:opam_configuration = {}
function! OpamConfOcpIndent()
execute "set rtp^=" . s:opam_share_dir . "/ocp-indent/vim"
endfunction
let s:opam_configuration['ocp-indent'] = function('OpamConfOcpIndent')
function! OpamConfOcpIndex()
execute "set rtp+=" . s:opam_share_dir . "/ocp-index/vim"
endfunction
let s:opam_configuration['ocp-index'] = function('OpamConfOcpIndex')
function! OpamConfMerlin()
let l:dir = s:opam_share_dir . "/merlin/vim"
execute "set rtp+=" . l:dir
endfunction
let s:opam_configuration['merlin'] = function('OpamConfMerlin')
let s:opam_packages = ["ocp-indent", "ocp-index", "merlin"]
let s:opam_check_cmdline = ["opam list --installed --short --safe --color=never"] + s:opam_packages
let s:opam_available_tools = split(system(join(s:opam_check_cmdline)))
for tool in s:opam_packages
" Respect package order (merlin should be after ocp-index)
if count(s:opam_available_tools, tool) > 0
call s:opam_configuration[tool]()
endif
endfor
" ## end of OPAM user-setup addition for vim / base ## keep this line
xcompose
Подключить стандартные наборы дистрибутива
include "%S/en_US.UTF-8/Compose"
include "%L"
Моё любимое
<Multi_key> <Cyrillic_yu> <Cyrillic_yu> : "…" ellipsis # HORIZONTAL ELLIPSIS
<Multi_key> <minus> <minus> : "–" U2013 # EN DASH
<Multi_key> <Cyrillic_BE> <Cyrillic_BE> : "«"
<Multi_key> <Cyrillic_YU> <Cyrillic_YU> : "»"
<Multi_key> <grave> <grave> : "́" U0301 # ударение
<Multi_key> <Cyrillic_io> <Cyrillic_io> : "́" # ударениее (комбинирующееся)
Греческий алфавит для всякой математики
<Multi_key> <G> <A> : "Α" U0391 # GREEK CAPITAL LETTER ALPHA
<Multi_key> <G> <B> : "Β" U0392 # GREEK CAPITAL LETTER BETA
<Multi_key> <G> <G> : "Γ" U0393 # GREEK CAPITAL LETTER GAMMA
<Multi_key> <G> <D> : "Δ" U0394 # GREEK CAPITAL LETTER DELTA
<Multi_key> <G> <E> : "Ε" U0395 # GREEK CAPITAL LETTER EPSILON
<Multi_key> <G> <Z> : "Ζ" U0396 # GREEK CAPITAL LETTER ZETA
<Multi_key> <G> <H> : "Η" U0397 # GREEK CAPITAL LETTER ETA
<Multi_key> <G> <I> : "Ι" U0399 # GREEK CAPITAL LETTER IOTA
<Multi_key> <G> <K> : "Κ" U039A # GREEK CAPITAL LETTER KAPPA
<Multi_key> <G> <L> : "Λ" U039B # GREEK CAPITAL LETTER LAMDA
<Multi_key> <G> <M> : "Μ" U039C # GREEK CAPITAL LETTER MU
<Multi_key> <G> <N> : "Ν" U039D # GREEK CAPITAL LETTER NU
<Multi_key> <G> <P> : "Π" U03A0 # GREEK CAPITAL LETTER PI
<Multi_key> <G> <R> : "Ρ" U03A1 # GREEK CAPITAL LETTER RHO
<Multi_key> <G> <S> : "Σ" U03A3 # GREEK CAPITAL LETTER SIGMA
<Multi_key> <G> <T> : "Τ" U03A4 # GREEK CAPITAL LETTER TAU
<Multi_key> <G> <U> : "Υ" U03A5 # GREEK CAPITAL LETTER UPSILON
<Multi_key> <G> <F> : "Φ" U03A6 # GREEK CAPITAL LETTER PHI
<Multi_key> <G> <X> : "Χ" U03A7 # GREEK CAPITAL LETTER CHI
<Multi_key> <G> <O> : "Ω" U03A9 # GREEK CAPITAL LETTER OMEGA
<Multi_key> <G> <Q> <T> : "Θ" U0398 # GREEK CAPITAL LETTER THETA
<Multi_key> <G> <Q> <O> : "Ο" U039F # GREEK CAPITAL LETTER OMICRON
<Multi_key> <G> <Q> <X> : "Ξ" U039E # GREEK CAPITAL LETTER XI
<Multi_key> <G> <Q> <P> : "Ψ" U03A8 # GREEK CAPITAL LETTER PSI
<Multi_key> <g> <a> : "α" U03B1 # GREEK SMALL LETTER ALPHA
<Multi_key> <g> <b> : "β" U03B2 # GREEK SMALL LETTER BETA
<Multi_key> <g> <g> : "γ" U03B3 # GREEK SMALL LETTER GAMMA
<Multi_key> <g> <d> : "δ" U03B4 # GREEK SMALL LETTER DELTA
<Multi_key> <g> <e> : "ε" U03B5 # GREEK SMALL LETTER EPSILON
<Multi_key> <g> <z> : "ζ" U03B6 # GREEK SMALL LETTER ZETA
<Multi_key> <g> <h> : "η" U03B7 # GREEK SMALL LETTER ETA
<Multi_key> <g> <i> : "ι" U03B9 # GREEK SMALL LETTER IOTA
<Multi_key> <g> <k> : "κ" U03BA # GREEK SMALL LETTER KAPPA
<Multi_key> <g> <l> : "λ" U03BB # GREEK SMALL LETTER LAMDA
<Multi_key> <g> <m> : "μ" U03BC # GREEK SMALL LETTER MU
<Multi_key> <g> <n> : "ν" U03BD # GREEK SMALL LETTER NU
<Multi_key> <g> <p> : "π" U03C0 # GREEK SMALL LETTER PI
<Multi_key> <g> <r> : "ρ" U03C1 # GREEK SMALL LETTER RHO
<Multi_key> <g> <s> : "σ" U03C3 # GREEK SMALL LETTER SIGMA
<Multi_key> <g> <t> : "τ" U03C4 # GREEK SMALL LETTER TAU
<Multi_key> <g> <u> : "υ" U03C5 # GREEK SMALL LETTER UPSILON
<Multi_key> <g> <f> : "φ" U03C6 # GREEK SMALL LETTER PHI
<Multi_key> <g> <x> : "χ" U03C7 # GREEK SMALL LETTER CHI
<Multi_key> <g> <o> : "ω" U03C9 # GREEK SMALL LETTER OMEGA
<Multi_key> <g> <q> <t> : "θ" U03B8 # GREEK SMALL LETTER THETA
<Multi_key> <g> <q> <o> : "ο" U03BF # GREEK SMALL LETTER OMICRON
<Multi_key> <g> <q> <p> : "ψ" U03C8 # GREEK SMALL LETTER PSI
<Multi_key> <g> <q> <s> : "ς" U03C2 # GREEK SMALL LETTER FINAL SIGMA
<Multi_key> <g> <q> <x> : "ξ" U03BE # GREEK SMALL LETTER XI
xmobar
Config {
font = "xft:Monospace-Bold:size=9"
, borderColor = "#303030"
, border = BottomBM 3
, borderWidth = 1
, bgColor = "black"
, fgColor = "grey"
, position = Static { xpos = 0, ypos = 0, width = 1600, height = 32 }
, lowerOnStart = True
, pickBroadest = False
, persistent = False
, hideOnStart = False
, iconRoot = "."
, allDesktops = True
, overrideRedirect = False
, commands = [
Run Weather "UUDD" ["-t", "<tempC>C"
, "-L", "18", "-H", "25"
, "--normal", "green"
, "--high", "red"
, "--low", "lightblue" ] 36000
, Run Memory ["-t","Mem: <usedratio>%"] 50
, Run Swap [] 100
, Run Date "%b %_d %Y %H:%M:%S" "date" 10
, Run StdinReader
TODO Батарейка
У одного из десктопов батарейка слегка умершая, выше 98% не показывает. Задача — не подсвечивать красным в этом случае. Документация.
, Run BatteryP ["BAT1"]
[
"-t", "<acstatus>"
, "-L", "20"
, "-l", "red"
, "--", "-O", "Charging", "-o", "<fc=white,red>Bat: <left>%</fc>"
] 10
Хвост
]
, sepChar = "%"
, alignSep = "}{"
, template = "%StdinReader% }{ | %memory% * %swap% | %battery% | %UUDD% | %date% "
}
xmonad
Основной конфиг
import Data.IORef
import GHC.IO.Handle.Types
import XMonad
import XMonad.Config.Gnome
import XMonad.Util.EZConfig
import XMonad.Hooks.ManageDocks
import qualified XMonad.StackSet as Win
import XMonad.Hooks.ManageHelpers
import XMonad.Layout.NoBorders
import XMonad.Layout.Named
import XMonad.Layout.Grid
import XMonad.Util.Run
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.DynamicLog
import XMonad.Prompt
import qualified XMonad.Prompt.Shell
import qualified XMonad.Prompt.Window
import XMonad.Util.Loggers
import XMonad.Util.Paste
import Data.Monoid
import Control.Monad (when, unless)
color1 = "#E1A81C"
color2 = "#290b64"
color3 = "#926b09"
color7 = "#808080"
color8 = "#404040"
color9 = "#101010"
color10 = "#f00000"
colorXmobarTitle = color1
colorXmobarWSHidden = color8
colorXmobarWSHiddenNoWindows = color8
colorXmobarWSActive = color10
colorXmobarSeparator = color7
colorXmobarLayoutRuBG = color10
colorPromptBG = color9
colorPromptFG = color1
colorBorderInactive = color2
colorBorderUS = color1
colorBorderRU = color10
role :: Query String
role = stringProperty "WM_WINDOW_ROLE"
gimpHooks :: Query (Endo WindowSet)
gimpHooks = composeAll [
(role =? "gimp-toolbox" <||> role =? "gimp-image-window") --> (ask >>= doF . Win.sink)
]
myManageHook :: Query (Endo WindowSet)
myManageHook = composeAll [
className =? "Xfce4-notifyd" --> doIgnore
, className =? "Do" --> doFloat
, title =? "Eclipse" --> doFloat
, className =? "skypeforlinux" --> doShift "5"
, className =? "TelegramDesktop" --> doShift "5"
, className =? "VirtualBox" --> doShift "8"
, role =? "CallWindow" --> doFullFloat
, composeOne [ isFullscreen -?> doFullFloat ]
, gimpHooks
]
gridLayout = named "Grid" $ Grid
myLayouts =
tiled ||| Mirror tiled ||| Full ||| gridLayout
where
tiled = Tall nmaster delta ratio
nmaster = 1
ratio = 2/3
delta = 3/100
myPromptConfig :: XPConfig
myPromptConfig = def {
height = 25
, font = "-misc-fixed-*-*-*-*-14-*-*-*-*-*-*-*"
, bgColor = colorPromptBG
, fgColor = colorPromptFG
}
myStartupHook = spawn "killall stalonetray; sleep 1; stalonetray &"
notify :: String -> String -> IO ()
notify timeout msg = safeSpawn "notify-send" ["-t", show timeout, msg]
get_internal_speakers :: IO String
get_internal_speakers = runProcessWithInput "sh" ["-c", "~/bin/sink_of_internal_speakers"] ""
setVolume :: String -> String -> IO ()
setVolume pct sink = spawn ("~/bin/set_sink_volume '" ++ sink ++ "' '" ++ pct ++ "'")
setVolumeInterval :: String -> X ()
setVolumeInterval pct =
io (get_internal_speakers >>= setVolume pct)
getBrightness :: () -> IO String
getBrightness () = runProcessWithInput "sh" ["-c", "sleep 0.2; xbacklight -get|cut -d. -f1"] ""
setBrightness :: String -> X ()
setBrightness cmdKeys =
io $ do
spawn ("xbacklight -time 1 -steps 1 " ++ cmdKeys)
v <- getBrightness ()
notify "500" ("Brightness " ++ v)
setWindowBorder' :: String -> Window -> X ()
setWindowBorder' c w = do
XConf { display = d } <- ask
~(Just pc) <- io $ initColor d c
io $ setWindowBorder d w pc
data KeyboardLayout = KbdUs | KbdRu
stringOfKbdLayout KbdUs = "us"
stringOfKbdLayout KbdRu = "ru"
colorOfKbdLayout KbdUs = colorBorderUS
colorOfKbdLayout KbdRu = colorBorderRU
emacsKeyOfKbdLayout KbdUs = xK_F11
emacsKeyOfKbdLayout KbdRu = xK_F12
refreshKeyboardLayoutEmacs layout = do
spawn $ "setxkbmap -layout " ++ stringOfKbdLayout KbdUs
sendKey mod1Mask $ emacsKeyOfKbdLayout layout
refreshKeyboardLayoutOtherWindow layout =
spawn $ "setxkbmap -layout " ++ stringOfKbdLayout layout
setKeyboardLayout currentKeyboardLayoutRef layout = do
io $ writeIORef currentKeyboardLayoutRef layout
withWindowSet $ \w -> case Win.peek w of
Nothing -> io $ return ()
Just w -> do
setWindowBorder' (colorOfKbdLayout layout) w
windowClass <- runQuery className w
case windowClass of
"Emacs" -> refreshKeyboardLayoutEmacs layout
_ -> refreshKeyboardLayoutOtherWindow layout
sendUpdateEvent :: () -> X ()
sendUpdateEvent _ =
ask >>= logHook . config
setNewKeyboardLayout :: IORef KeyboardLayout -> KeyboardLayout -> X ()
setNewKeyboardLayout currentKeyboardLayoutRef layout =
do
setKeyboardLayout currentKeyboardLayoutRef layout
sendUpdateEvent ()
loggerKbdLayout :: IORef KeyboardLayout -> XMonad.Util.Loggers.Logger
loggerKbdLayout currentKeyboardLayoutRef =
io $ do layout <- readIORef currentKeyboardLayoutRef
return $ Just $ case layout of
KbdUs -> "<fc=white> ENG </fc>"
KbdRu -> "<fc=white," ++ colorXmobarLayoutRuBG ++ "> RUS </fc>"
Ждём 0.2 секунды перед блокировкой т.к. в ином случае оно иногда не блокирует. Предположительно, xautolock получает события от клавиатуры в момент лока и отменяет блокировку.
lockScreen :: IORef KeyboardLayout -> X ()
lockScreen currentKeyboardLayoutRef =
do
setNewKeyboardLayout currentKeyboardLayoutRef KbdUs
spawn "sleep 0.2; xautolock -locknow"
myConfig currentKeyboardLayoutRef = def {
manageHook = manageDocks <+> myManageHook <+> manageHook gnomeConfig
, layoutHook = avoidStruts $ smartBorders $ myLayouts
, modMask = mod4Mask
, terminal = "urxvtc"
, startupHook = myStartupHook
, borderWidth = 4
, normalBorderColor = colorBorderInactive
, focusedBorderColor = colorBorderUS
, handleEventHook = fullscreenEventHook
}
`additionalKeys` [
((noModMask, xK_Menu), setNewKeyboardLayout currentKeyboardLayoutRef KbdUs)
, ((controlMask, xK_Menu), setNewKeyboardLayout currentKeyboardLayoutRef KbdRu)
, ((mod4Mask, xK_Print ), spawn "mate-screenshot -i") -- не работает именно на <Print> почему-то
]
`additionalKeysP` [
("M-n", spawn "firefox")
, ("M-S-n c", spawn "google-chrome")
, ("M-S-n i", spawn "google-chrome --incognito")
, ("M-S-n f", spawn "firefox")
-- other start
, ("M-t", spawn "urxvtc")
, ("M-e", spawn "editor")
, ("S-M-<Space>", XMonad.Prompt.Shell.shellPrompt myPromptConfig)
, ("M-S-s", XMonad.Prompt.Window.windowPromptGoto myPromptConfig)
-- показать перевод слова из буфера обмена
, ("M-S-t", spawn "sdcv -n \"`xclip -o | perl -C7 -pe 's/[^\\w-]//ig'`\" >/tmp/dict.txt 2>&1 ; editor /tmp/dict.txt")
-- sound volume
, ("<XF86AudioMute>", spawn "pactl -- set-sink-mute 0 toggle")
, ("S-<XF86AudioMute>", setVolumeInterval "100%")
, ("<XF86AudioLowerVolume>", setVolumeInterval "-2%")
, ("<XF86AudioRaiseVolume>", setVolumeInterval "+2%")
, ("S-<XF86AudioLowerVolume>", setVolumeInterval "-20%")
, ("S-<XF86AudioRaiseVolume>", setVolumeInterval "+20%")
-- LCD brightness
, ("<XF86MonBrightnessUp>", setBrightness "-inc 10")
, ("<XF86MonBrightnessDown>", setBrightness "-dec 10")
, ("S-<XF86MonBrightnessUp>", setBrightness "-set 100")
-- power management
, ("<XF86Search>", lockScreen currentKeyboardLayoutRef)
, ("<XF86HomePage>", lockScreen currentKeyboardLayoutRef)
, ("M-f", withFocused $ windows . Win.sink)
, ("M-d", sendMessage $ ToggleStrut L)
, ("M-i d d q d", lockScreen currentKeyboardLayoutRef)
, ("M-c c", spawn "emacsclient -c --eval '(org-capture)'")
]
xmobarPrinter :: IORef KeyboardLayout -> GHC.IO.Handle.Types.Handle -> PP
xmobarPrinter currentKeyboardLayoutRef handler
= def {
ppOutput = hPutStrLn handler
, ppTitle = pangoColor colorXmobarTitle . pangoSanitize
, ppExtras = [
XMonad.Util.Loggers.logLayout
, (loggerKbdLayout currentKeyboardLayoutRef)
]
, ppOrder = \(workspace : _ : wintitle : layout : kbd : _ ) -> [kbd, workspace, layout, wintitle]
, ppCurrent = pangoColor colorXmobarWSActive . pangoSanitize
, ppHidden = pangoSanitize
, ppHiddenNoWindows = pangoColor colorXmobarWSHiddenNoWindows . pangoSanitize
, ppUrgent = pangoColor "#E1340F"
, ppLayout = const ""
, ppSep = pangoColor colorXmobarSeparator " | "
}
type WindowSwitchHook = Maybe Window -> Maybe Window -> X ()
windowSwitchHandler :: IORef (Maybe Window) -> WindowSwitchHook -> X () -> X ()
windowSwitchHandler lastWindowRef hook x = do
withWindowSet $ \w -> do
let currentWindow = Win.peek w
lastWindow <- io $ readIORef lastWindowRef
if lastWindow /= currentWindow then
do
io $ writeIORef lastWindowRef currentWindow
hook lastWindow currentWindow
else
io $ return ()
x
updateKbdLayout :: IORef KeyboardLayout -> Maybe Window -> Maybe Window -> X ()
updateKbdLayout currentKeyboardLayoutRef _ _ =
do currentKeyboardLayout <- io $ readIORef currentKeyboardLayoutRef
setKeyboardLayout currentKeyboardLayoutRef currentKeyboardLayout
main = do
xmobarHdl <- spawnPipe "xmobar"
do currentKeyboardLayoutRef <- newIORef KbdUs
lastWindow <- newIORef Nothing
xmonad (myConfig currentKeyboardLayoutRef) {
logHook = windowSwitchHandler lastWindow (updateKbdLayout currentKeyboardLayoutRef) $ dynamicLogWithPP (xmobarPrinter currentKeyboardLayoutRef xmobarHdl)
}
pangoColor :: String -> String -> String
pangoColor fg = wrap left right
where
left = "<fc=" ++ fg ++ ">"
right = "</fc>"
pangoSanitize :: String -> String
pangoSanitize = Prelude.foldr sanitize ""
where
sanitize '>' xs = ">" ++ xs
sanitize '<' xs = "<" ++ xs
sanitize '\"' xs = """ ++ xs
sanitize '&' xs = "&" ++ xs
sanitize x xs = x:xs
xmonad-session-rc
Основное
#!/bin/bash
export PATH=~/bin/:"$PATH"
xrdb -merge <~/.Xresources
hsetroot -center ~/Pictures/wallpaper-cron.jpg
parcellite &
blueman-applet &
nm-applet &
pasystray &
eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
export SSH_AUTH_SOCK
urxvtd &
emacs --daemon &
synclient VertEdgeScroll=1
run-parts ~/.xmonad/xmonad-session-local.d
Блокировка экрана
Отказался от xscreensaver в пользу xautolock+i3lock в связи с тем, что xscreensaver не дружит с альтернативными раскладками клавиатуры.
UPDATE [2019-02-04 Пн]: i3lock тоже не дружит, поэтому теперь сбрасываю раскладку перед блокировкой.
xset dpms 180 300 360
xautolock -time 5 -locker 'setxkbmap -layout us; i3lock -f -c "#101010"' &
Раскладка клавиатуры
Раскладкой управляет xmonad, задействованы физические кнопки:
Caps
для переключения на enCtrl-Caps
для переключения в ru
Но проблема в том, что нельзя назначить на Caps какие-либо действия в
клиентах, поскольку эта кнопка не долетает до них от X Server. Поэтому
я переназначил поведение кнопки CapsLock на генерацию кода кнопки
Menu, и xmonad обрабатывает эти кнопки уже как Menu
и Ctrl-Menu
.
Базовые настройки, в т.ч. обнуление опций:
setxkbmap -option ''
setxkbmap -layout 'us,ru'
Назначаем XCompose на правый Alt, заставляем CapsLock генерировать код Menu:
setxkbmap -option 'compose:ralt,caps:menu,grp_led:caps'
Разрешить руту ходить в наш X Server
xhost +si:localuser:root
xresources
Emacs.font: Monospace-10
Xcursor.size: 16
XTerm*background: black
XTerm*foreground: gray
XTerm*scrollTtyOutput: no
XTerm*scrollKey: yes
XTerm*faceSize: 10
Xft.antialias: true
Xft.dpi: 96
Xft.hinting: true
Xft.hintstyle: hintsfull
Xft.rgba: none
URxvt*geometry: 120x35
URxvt*font: xft:DejaVu Sans Mono-12
URxvt*background: black
URxvt*foreground: gray
URxvt*scrollstyle: rxvt
URxvt*termName: xterm
URxvt.perl-ext-common: default,el-public-snippets,el-public-set-font-size
URxvt.urlLauncher: chromium-browser
URxvt.matcher.button: 1
URxvt.colorUL: #86a2be
URxvt*secondaryScroll: true
URxvt*fading: 40
URxvt*scrollBar: false
URxvt.keysym.C-Up: perl:font-size:increase
URxvt.keysym.C-Down: perl:font-size:decrease
URxvt*iso14755: False
URxvt*iso14755_52: False
! Home
URxvt*keysym.0xff50: \033OH
! End
URxvt*keysym.0xff57: \033OF
! Shift-PgUp
!URxvt*keysym.0xff55: \033[5~
! Shift-PgDown
!URxvt*keysym.0xff56: \033[6~
URxvt*keysym.0xffff: \033[3~
*Rxvt*meta8: false
*Rxvt.keysym.C-Left: \033[1;5D
*Rxvt.keysym.C-Right: \033[1;5C
*Rxvt.keysym.M-Left: \033[1;3D
*Rxvt.keysym.M-Right: \033[1;3C
Однажды ко мне подошли и сказали, что в принтере в другом конце здания лежит много листочков с моей фамилией. Оказалось, что urxvt при нажатии кнопки PrintScreen печатает всю историю консоли. А я в тот день пару раз промахнулся мимо Insert. Пришлось срочно заделывать течь в безопасности вот таким способом.
URxvt*print-pipe: cat >/dev/null
/etc/systemd/logind.conf
Преамбула
[Login]
Не надо выключать ноутбук по кнопке poweroff. Это очень раздражает
HandlePowerKey=ignore
/etc/acpi/events/xlockscreen (блокировка экрана при закрытии крышки)
event=button/lid.*
action=DISPLAY=:0 xautolock -locknow
Исходник статьи
Ссылка для скачивания: dotfiles.sorg.
Прочее (tangle на сниппеты не включен)
crontab
Текущая погода на корневом окне:
18 * * * * (wget -O ~/Pictures/wallpaper-cron.jpg http://images.opentopia.com/sunlight/world_sunlight_map_rectangular.jpg && DISPLAY=:0 hsetroot -center ~/Pictures/wallpaper-cron.jpg) >/dev/null 2>&1
Перегенерить ssh-конфиг из кусочков:
*/3 * * * * ~/bin/update-ssh-config >/dev/null 2>&1
Локальная копия почты:
*/10 * * * * (timeout -s9 120 ~/bin/offlineimap -o -1; notmuch new ) >/dev/null 2>&1
Проверяем обновления софта, создаем в org-mode таск:
0 6 * * * ~/bin/john_apt_check_updates >/dev/null 2>&1
Синхронизируем BBDB с google-контактами:
21 21 * * * python ~/bin/ASynK/asynk.py --op=sync --name main >/dev/null 2>&1