1
0
mirror of https://github.com/jdhao/nvim-config.git synced 2025-06-08 14:14:33 +02:00

388 Commits

Author SHA1 Message Date
jdhao
43c1615822 fix: cmp-omni messes with the lsp completion
If we use cmp-omni and lsp together, it seems that it will mess the
autocompletion. So we only use it with tex file, where lsp in not used.
2022-11-22 21:19:53 +08:00
jdhao
509a8bce8c upgrade to latest stable 0.8.1 2022-11-22 21:16:17 +08:00
jdhao
8b10be60d4 update colorscheme list
- remove other gruvbox variant
- remove doom-one casue it has bugs
- add more colorschemes
2022-11-16 02:26:28 +08:00
jdhao
074d2bbdfd make filetype mapping local
Otherwise, the mapping will be global and leak to unrelated to files.
2022-11-15 01:10:26 +08:00
jdhao
7f9af87185 Merge branch 'master' of https://github.com/jdhao/nvim-config 2022-11-15 01:07:29 +08:00
jdhao
bb0b0c5e25 chore: relax vimtex install condition 2022-11-15 01:06:59 +08:00
jdhao
7bb12e4b70 chore: relax vimtex install condition 2022-11-15 01:04:31 +08:00
jdhao
41da56b823 Add my own abbreivations for some spell mistakes 2022-11-13 19:53:14 +08:00
jdhao
82f2332281 chore: update gitsigns highlight 2022-11-10 00:43:15 +08:00
jdhao
075326ee2e fix: make xkbswitch work on mac M1 CPU
For the details, see https://jdhao.github.io/2021/02/25/nvim_ime_mode_auto_switch/.
2022-11-07 00:47:04 +08:00
jdhao
baa8f26bc2 update spell 2022-11-01 22:27:35 +08:00
jdhao
e9760ae9b8 remove smooth scroll
I do not really need it.
2022-11-01 22:19:03 +08:00
jdhao
0d50eb723f chore: add notification for packer compile
Also move the autocmd location.
2022-11-01 22:02:45 +08:00
jdhao
b893bdc099 fix incorrect comment string for gitconf 2022-10-27 21:59:05 +08:00
jdhao
2073f72e67 refactor: use local diagnostic module 2022-10-23 15:18:03 +08:00
jdhao
364be4b5dc fix links 2022-10-20 13:23:38 +08:00
jdhao
d30d402128 update option 2022-10-19 20:52:51 +08:00
jdhao
fc144e0895 update badge 2022-10-19 12:13:13 +08:00
jdhao
18abfa7754 feat: add a mapping to blink cursor 2022-10-17 00:07:34 +08:00
jdhao
6c1dbdf8fc update spell 2022-10-16 10:26:41 +08:00
jdhao
202a9a088d remove vim-json
rarely used and it changes the conceal settings
2022-10-16 10:24:53 +08:00
jdhao
d939cc75c6 refactor: make packer installation a function 2022-10-16 10:23:40 +08:00
jdhao
26921309ec replace more viml with native lua code 2022-10-15 19:00:34 +08:00
jdhao
a6f716558b update nvim-cmp lsp conf 2022-10-15 18:30:14 +08:00
jdhao
3539207913 use 2 spaces for tabs by default
This removes a lot of code duplication. If we want to use 4 spaces, we
can set it separately in their ftplugin settings.
2022-10-15 11:28:15 +08:00
jdhao
d8b92965e8 change tab size for sql 2022-10-11 00:51:00 +08:00
jdhao
ebf7170916 use UTF-8 instead of utf-8, closes #134 2022-10-09 13:23:01 +08:00
jdhao
696466469b update spell 2022-10-05 23:01:23 +08:00
jdhao
7a5be43600 use lua func in rhs instead of callback 2022-10-05 22:42:02 +08:00
jdhao
3b39067097 update mousescroll 2022-10-05 22:39:13 +08:00
jdhao
e6b3be0777 remove language workaround for macOS
The issue has been fixed in https://github.com/neovim/neovim/pull/19139.
2022-10-05 22:33:13 +08:00
jdhao
acb423984a remove vim-asterisk
The * can now search selected text by default. The cursor stay feature
can also be simulated.
2022-10-05 12:42:45 +08:00
jdhao
d40d87cb61 nvim 0.8 update 2022-10-04 19:34:20 +08:00
jdhao
81663c8f3c update markdown-preview.nvim install method 2022-10-04 13:15:26 +08:00
jdhao
2c7e4aa87a Merge pull request #123 from jdhao/repolink
update repo link for transferred plugins
2022-09-29 00:00:12 +08:00
jdhao
07dd60206b update repo link for transferred plugins 2022-09-28 23:57:36 +08:00
jdhao
c3d4eb371b Merge pull request #122 from jdhao/opt
always use sign column
2022-09-28 23:40:12 +08:00
jdhao
597a2aba80 always use sign column 2022-09-28 23:39:09 +08:00
jdhao
f1f6d0b351 Merge pull request #121 from jdhao/clean
remove config for unused plugins
2022-09-28 23:37:54 +08:00
jdhao
e1930ba153 remove config for unused plugins
vim-signify, vim-startify
2022-09-28 23:36:44 +08:00
jdhao
a8db734e75 Merge pull request #120 from jdhao/firenvim
update conf related to firenvim
2022-09-28 23:32:48 +08:00
jdhao
4026baef19 update conf related to firenvim
1. Change autocmd for buffers started by firenivm, it seems that
   BufNewFile does not work as intended, in contrast, BufEnter, BufRead,
   BufWinEnter seem to work.
2. Disable several plugins if we are using firenvim, these plugins
   include dashboard-nvim, lualine, bufferline.nvim
2022-09-28 23:22:23 +08:00
jdhao
f63152f79b Merge pull request #118 from jdhao/gitsign
hilight update for gitsigns.nvim
2022-09-28 00:32:57 +08:00
jdhao
5229c460ea hilight update for gitsigns.nvim 2022-09-28 00:32:07 +08:00
jdhao
f308ccad7b Merge pull request #116 from jdhao/fugitive
correct :git to :Git
2022-09-25 23:44:13 +08:00
jdhao
09dd81bf67 correct :git to :Git 2022-09-25 23:42:50 +08:00
jdhao
5ecb74ad85 more mapping and doc update for gitlinker 2022-09-25 23:39:33 +08:00
jdhao
773003b71b Merge pull request #115 from jdhao/sql
change sql comment style
2022-09-25 23:15:51 +08:00
jdhao
f5097b44b9 change sql comment style 2022-09-25 23:02:16 +08:00
jdhao
238886c136 Merge pull request #114 from jdhao/setup
fix: variable case not consistent, close #113
2022-09-25 11:02:47 +08:00
jdhao
2fccb59293 fix: variable case not consistent, close #113 2022-09-25 11:01:30 +08:00
jdhao
830297a973 Merge pull request #111 from jdhao/gitsign
enable word diff for gitsigns.nvim
2022-09-24 15:37:15 +08:00
jdhao
1f3fcc604a enable word diff for gitsigns.nvim
Also tweak the highlight for word diff to make clear. The default
highlgiht for word diff is TermCursor, which is unreadable.
2022-09-24 15:34:54 +08:00
jdhao
7f5bf5a1b2 Merge pull request #110 from jdhao/nvimtree
update nvim-tree conf
2022-09-23 20:46:49 +08:00
jdhao
81bc5e46f1 update nvim-tree conf 2022-09-23 20:45:58 +08:00
jdhao
b4c3b7eba0 Merge pull request #109 from jdhao/spell
update spell
2022-09-20 01:20:19 +08:00
jdhao
4203410878 update spell 2022-09-20 01:19:44 +08:00
jdhao
9f58c3b7a5 Merge pull request #108 from jdhao/gitsign
update gitsigns conf
2022-09-20 01:18:00 +08:00
jdhao
45d0d68b9e update gitsigns conf 2022-09-20 01:15:16 +08:00
jdhao
74a9767018 Merge pull request #107 from jdhao/option
noruler
2022-09-15 12:19:31 +08:00
jdhao
ab25bfc9c4 noruler 2022-09-15 12:18:26 +08:00
jdhao
ebbdb27d01 Merge pull request #106 from chaoqunya/chaoqunya-fix-typo-in-mappings
typo fixed
2022-09-13 14:27:15 +08:00
chaoqunya
1b1f0199da typo fixed 2022-09-13 14:22:46 +08:00
jdhao
40fa9aab1c Merge pull request #104 from jdhao/global
global.vim --> global.lua
2022-09-11 18:24:10 +08:00
jdhao
6e8e61e53a global.vim --> global.lua
fix 2

fix 3
2022-09-11 18:21:56 +08:00
jdhao
89effe8b17 Merge pull request #103 from jdhao/format
format with stylua
2022-09-10 23:56:04 +08:00
jdhao
aaeb6a813a format with stylua 2022-09-10 23:55:22 +08:00
jdhao
9ba728e201 Merge pull request #102 from jdhao/lualine
use gitsigns for diff
2022-09-10 22:57:06 +08:00
jdhao
e5f1b4d224 use gitsigns for diff
Lualine's builtin diff often disappears and is not reliable, which is really frustrating for me.
2022-09-10 22:55:22 +08:00
jdhao
eaddee0c5c Merge pull request #101 from jdhao/lsp-map
refactor: lsp mapping
2022-09-09 19:42:42 +08:00
jdhao
0582f26abe refactor: lsp mapping 2022-09-09 19:42:01 +08:00
jdhao
e209ef686a Merge pull request #100 from jdhao/hlslens
update hlslens conf
2022-09-09 19:22:18 +08:00
jdhao
8b3610ed3d update hlslens conf 2022-09-09 19:21:25 +08:00
jdhao
bde6083f22 Merge pull request #99 from jonghoonseo/master
Use node dir when already installed
2022-09-09 19:15:02 +08:00
Jonghoon Seo
c1f139108a Use node dir when already installed 2022-09-09 05:30:41 +09:00
jdhao
3bb8b224e7 Merge pull request #98 from jdhao/clean-plug
remove unused plugins
2022-09-08 20:36:19 +08:00
jdhao
b69320b4e2 remove unused plugins 2022-09-08 20:35:34 +08:00
jdhao
5c63ade4a0 Merge pull request #97 from jdhao/gitsigns
use gitsigns instead of signify
2022-09-08 20:33:06 +08:00
jdhao
b504c932e6 use gitsigns instead of signify 2022-09-08 20:31:33 +08:00
jdhao
a39befff93 Merge pull request #96 from jdhao/map
update mapping
2022-09-08 13:20:45 +08:00
jdhao
309c8ad636 update mapping 2022-09-08 13:19:34 +08:00
jdhao
954a4a1cad Merge pull request #95 from jdhao/error-msg
refactor: use nvim_err_writeln for error msg
2022-09-07 23:36:49 +08:00
jdhao
67a322c26c refactor: use nvim_err_writeln for error msg 2022-09-07 23:35:18 +08:00
jdhao
91c9dbe40d Merge pull request #94 from jdhao/neovide
add neovide conf
2022-09-07 23:31:57 +08:00
jdhao
6a5f1d24a7 add neovide conf 2022-09-07 23:30:52 +08:00
jdhao
4dcafbe2bc Merge pull request #93 from jdhao/local-keymap
use local keymap
2022-09-06 21:54:18 +08:00
jdhao
14860072d0 use local keymap 2022-09-06 21:53:44 +08:00
jdhao
5a69d43cab Merge pull request #92 from jdhao/lua-map
refactor: convert mapping from viml to lua
2022-09-06 21:26:12 +08:00
jdhao
11e6797cb5 refactor: convert mapping from viml to lua 2022-09-06 21:22:45 +08:00
jdhao
858848128f Merge pull request #91 from jdhao/spell
update spell
2022-09-06 13:25:44 +08:00
jdhao
d436227f65 update spell 2022-09-06 13:24:44 +08:00
jdhao
acb8b7fcf8 Merge pull request #90 from jdhao/reorg
better-escape.vim is now under nvim-zh org
2022-09-05 01:02:06 +08:00
jdhao
46cbdc2d7f better-escape.vim is now under nvim-zh org 2022-09-05 01:00:42 +08:00
jdhao
c71ad44cd3 Merge pull request #89 from jdhao/hop
update hop.nvim conf
2022-09-05 00:54:05 +08:00
jdhao
db378b858b update hop.nvim conf 2022-09-05 00:53:23 +08:00
jdhao
ee45f1f5a1 Merge pull request #88 from jdhao/gitlinker
add plugin gitlinkder.nvim
2022-09-05 00:48:57 +08:00
jdhao
43660dd540 add plugin gitlinkder.nvim 2022-09-05 00:48:10 +08:00
jdhao
17acda10a0 fix 2022-09-01 13:24:52 +08:00
jdhao
eb87c5b0c3 Merge pull request #87 from jdhao/autocmd
simplify and add new autocmd
2022-09-01 13:24:05 +08:00
jdhao
b35956e6cd simplify and add new autocmd 2022-09-01 13:22:49 +08:00
jdhao
82f4c0e399 Merge pull request #86 from jdhao/hop
update hop.nvim conf
2022-08-31 23:57:49 +08:00
jdhao
16be5e0499 update hop.nvim conf 2022-08-31 23:56:52 +08:00
jdhao
a39b53b7c1 Merge pull request #85 from jdhao/packer
update packer conf
2022-08-31 00:02:32 +08:00
jdhao
b9616aeab0 update packer conf 2022-08-31 00:01:38 +08:00
jdhao
208b190a65 Merge pull request #84 from jdhao/indentline
update indent-blankline conf
2022-08-28 14:56:35 +08:00
jdhao
602254a881 update indent-blankline conf 2022-08-28 14:55:42 +08:00
jdhao
7022eefe22 Merge pull request #83 from jdhao/colorscheme
use colorscheme instead of theme
2022-08-28 13:09:17 +08:00
jdhao
dee7768162 use colorscheme instead of theme 2022-08-28 13:08:22 +08:00
jdhao
22b33871ef Merge pull request #82 from jdhao/linux-setup
update linux setup
2022-08-28 12:47:30 +08:00
jdhao
aab74751f4 update linux setup 2022-08-28 12:47:01 +08:00
jdhao
5dbe643ea2 Merge pull request #81 from jdhao/reorg
refactor a bit
2022-08-28 12:46:15 +08:00
jdhao
b41998828d refactor a bit
1. change theme to colorscheme
2. update plugin load logic
2022-08-28 12:43:50 +08:00
jdhao
3670a19e51 Merge pull request #80 from jdhao/cmp-conf
update nvim-cmp conf
2022-08-28 11:13:32 +08:00
jdhao
545c6f4b92 update nvim-cmp conf 2022-08-28 11:02:01 +08:00
jdhao
86e3b29730 Merge pull request #79 from jdhao/fix-notify
fix parameter for vim.notify
2022-08-26 20:01:56 +08:00
jdhao
bc9b0a8cf8 fix parameter for vim.notify 2022-08-26 19:47:56 +08:00
jdhao
fb9a0bb2dd Merge pull request #78 from jdhao/theme
refactor: theme.vim --> theme.lua
2022-08-26 18:44:11 +08:00
jdhao
59525c5577 refactor: theme.vim --> theme.lua 2022-08-26 18:42:30 +08:00
jdhao
6539e72a5d Merge pull request #75 from jdhao/typo-fix
fix some typos
2022-08-23 21:12:50 +08:00
jdhao
b279c0cd95 fix some typos 2022-08-23 21:12:04 +08:00
jdhao
96129335ad Merge pull request #74 from jdhao/delimitMate
update delimitMate conf for lua
2022-08-23 13:19:52 +08:00
jdhao
b6fa0b7aa5 update delimitMate conf for lua 2022-08-23 13:19:02 +08:00
jdhao
dff469ddc4 spell 2022-08-22 21:03:37 +08:00
jdhao
6d5cda0f97 Merge pull request #73 from jdhao/bufferline
update bufferline.nvim conf
2022-08-22 21:00:14 +08:00
jdhao
4d35362e83 update bufferline.nvim conf 2022-08-22 20:59:26 +08:00
jdhao
e57e747b26 Merge pull request #72 from jdhao/lua-au-ctx
refactor: use ctx table for lua autocmd callback
2022-08-21 18:21:22 +08:00
jdhao
c3f8d75ece refactor: use ctx table for lua autocmd callback 2022-08-21 18:20:21 +08:00
jdhao
78baf8d015 Merge pull request #71 from jdhao/snip
update markdown snippet
2022-08-21 11:48:15 +08:00
jdhao
9d8a58be17 update markdown snippet 2022-08-21 11:47:03 +08:00
jdhao
2372d9159f Merge pull request #70 from jdhao/lua-autuocmd
refactor: move part of autocmd to lua script
2022-08-20 02:02:12 -05:00
jdhao
e9a3d16260 refactor: move part of autocmd to lua script 2022-08-20 15:00:10 +08:00
jdhao
fdf8236fc2 Merge pull request #69 from jdhao/fix-autocmd
update the autocmd for saving a file
2022-08-20 00:52:33 -05:00
jdhao
085c8017d8 update the autocmd for saving a file 2022-08-20 13:50:23 +08:00
jdhao
efa7b215e7 Merge pull request #68 from jdhao/install-win
update install script for Windows
2022-08-19 07:06:43 -05:00
jdhao
e68c687f23 update install script for Windows 2022-08-19 20:05:40 +08:00
jdhao
497f93d6c7 Merge pull request #67 from jdhao/packer-autoinstall
feat: auto-install plugins for fresh install
2022-08-18 11:43:49 -05:00
jdhao
cfe2e0611d feat: auto-install plugins for fresh install 2022-08-19 00:42:02 +08:00
jdhao
9de08d0afe Merge pull request #66 from jdhao/lsp
add config dir to workspace.library for lua lsp
2022-08-18 13:16:51 +08:00
jdhao
d5b7584e68 add config dir to workspace.library for lua lsp 2022-08-18 13:15:20 +08:00
jdhao
64a7a23309 Merge pull request #64 from jdhao/fix-firenvim
update firenvim conf
2022-08-15 22:57:50 +08:00
jdhao
c1efc0bad6 update firenvim conf 2022-08-15 22:56:56 +08:00
jdhao
b3b69f21f4 update mapping 2022-08-15 00:22:24 +08:00
jdhao
f491e26676 Merge pull request #63 from jdhao/large-file
handle large file better
2022-08-15 00:08:16 +08:00
jdhao
e7e4892c22 handle large file better 2022-08-15 00:06:52 +08:00
jdhao
a52a362b02 update version check 2022-08-14 22:54:19 +08:00
jdhao
2880d7bce3 chore: renaming 2022-08-14 20:16:00 +08:00
jdhao
7e6dd23d37 add fidget-nvim for lsp-progress 2022-08-14 20:12:52 +08:00
jdhao
fcbd7d3a0d Merge pull request #62 from jdhao/lua-lsp
update lua lsp conf
2022-08-14 18:11:41 +08:00
jdhao
97f302084f update sumneko lua settings
1. remove runtime.path settings. It seems that it is not necessary, 03a047ef52.
2. update workspace.library, ref plugin ii14/emmylua-nvim
2022-08-14 17:53:40 +08:00
jdhao
9d29544d72 update linux setup script
1. lua-language-server
2. format fix
2022-08-14 12:01:38 +08:00
jdhao
cad9f5a214 make inspect() global 2022-08-14 11:39:37 +08:00
jdhao
ecde08941b update lua-language-server conf
lua-language-server has changed its running method significantly, so we
need to change it in the nvim-lspconfig.
2022-08-13 23:08:25 +08:00
jdhao
ab88c112ff make dashboard-nvim an opt plugin 2022-08-13 23:03:42 +08:00
jdhao
4c96243a4c init.vim --> init.lua cleanup 2022-08-13 22:45:13 +08:00
jdhao
fdc158272b init.vim --> init.lua follow 2022-08-13 22:43:33 +08:00
jdhao
b331cddc73 Merge pull request #61 from jdhao/init.lua
Transition from init.vim to init.lua
2022-08-13 22:39:47 +08:00
jdhao
b11c57e36f Transition from init.vim to init.lua 2022-08-13 22:37:49 +08:00
jdhao
84d73660fa add stylua conf 2022-08-13 17:12:08 +08:00
jdhao
a9cc10b2ef Merge pull request #60 from jdhao/doc
update setup doc
2022-08-12 20:32:48 +08:00
jdhao
cad6112cc2 update setup doc 2022-08-12 20:31:32 +08:00
jdhao
4d7fd6580a Merge pull request #58 from jdhao/mapping-doc
update readme about mappings
2022-08-11 01:29:33 +08:00
jdhao
f492a94db6 update readme about mappings 2022-08-11 01:28:14 +08:00
jdhao
0c92d9a018 update mappings
1. add mapping for gJ
2. remove mappings for <C-H>, since I rarely use them
2022-08-10 21:24:14 +08:00
jdhao
369687b047 refactor: disable showing trailing space and mix indent for non-modifiable buffers 2022-08-07 00:25:08 +08:00
jdhao
54908dfe9f fix: dashboard map is not local 2022-08-07 00:24:37 +08:00
jdhao
2e5f5c5991 update demo image in README 2022-08-07 00:12:55 +08:00
jdhao
8291b15599 remove alpha-nvim, use dashboard-nvim 2022-08-07 00:01:23 +08:00
jdhao
3de31f7d0a disable language command in macOS for now
Due to packaging issue, nvim version 0.7.2 for macOS does not have
`:language` command built in, see also neovim/neovim#19127.
2022-08-06 22:36:49 +08:00
jdhao
6b59c268f9 Merge pull request #57 from jdhao/fix-trailing-space
fix: trailing white sapces do not show as expected
2022-08-06 17:22:32 +08:00
jdhao
dd550dc3d0 fix: trailing white sapces do not show as expected
The plugin whitespace.nvim has changed its internal implementation.
It is not reliable to depend on external plugins.
2022-08-06 17:19:13 +08:00
jdhao
3aae07df56 Merge pull request #56 from jdhao/js-setup
add setup for javascript
2022-08-06 14:23:31 +08:00
jdhao
ed5ddf60cc add setup for javascript 2022-08-06 14:20:28 +08:00
jdhao
bcdc8d3f66 small fix 2022-08-01 20:57:37 +08:00
jdhao
5498a05bf7 revert to vim-auto-save
auto-save.nvim is erroring out
2022-08-01 01:14:09 +08:00
jdhao
644f8b6e2d add theme catppuccin 2022-07-28 01:32:41 +08:00
jdhao
3af7dd51b8 update packer config 2022-07-28 01:22:10 +08:00
jdhao
e0fc068f2e update nvim-cmp conf since cmp-nvim-lua is removed 2022-07-28 00:51:48 +08:00
jdhao
58ed71f870 use emmylua-nvim instead of cmp-nvim-lua for better completion 2022-07-27 21:08:03 +08:00
jdhao
aae9a7b7a7 update winblend 2022-07-27 13:17:22 +08:00
jdhao
33270f3257 add command ToPDF 2022-07-19 01:18:26 +08:00
jdhao
99d5a0343b update title str format 2022-07-11 23:14:16 +08:00
jdhao
3678da1b3c update titlestring 2022-07-02 16:47:58 +08:00
jdhao
a8fdbf3573 disable showing current theme used 2022-06-28 00:36:37 +08:00
jdhao
351ba5fc63 update option shortmess 2022-06-28 00:36:19 +08:00
jdhao
6dfaf2c521 minor tweak: version checking 2022-06-28 00:23:53 +08:00
jdhao
ae759477c7 bump version to 0.7.2 2022-06-28 00:09:42 +08:00
jdhao
921fd17221 update macos install script 2022-06-27 23:34:23 +08:00
jdhao
81696c9e13 update python snippet 2022-06-14 22:02:26 +08:00
jdhao
32b1d3ac16 disable sql omni completion 2022-06-05 21:10:04 +08:00
jdhao
e3b15da059 add lua map module and more mappings 2022-05-29 12:27:26 +08:00
jdhao
934ef7fb13 update spell 2022-05-29 11:03:18 +08:00
jdhao
3ee785506c disable alpha-nvim
There are errors with nvim 0.7.
2022-05-29 11:01:36 +08:00
jdhao
428f612bb3 update linux setup script 2022-05-21 10:43:15 +08:00
jdhao
95b7ee5bc8 lsp: only show diagnostic once for each line if cursor is not moved
This will help use to check signature help without it being overwritten
by diagnostic popups.
2022-05-18 13:32:35 +08:00
jdhao
4899a82b35 refactor: local fn = vim.fn 2022-05-15 21:16:02 +08:00
jdhao
424981683e change location of packer_compiled.lua 2022-05-15 17:58:47 +08:00
jdhao
c3253a5731 use vim.pretty_print for checking lua objects 2022-05-14 00:59:00 +08:00
jdhao
a9be0d0b20 add mapping to run vim script file 2022-05-09 22:10:35 +08:00
jdhao
13111596b8 check if nvim version is correct, see also #51 2022-05-09 22:06:17 +08:00
jdhao
6cea10fcc5 update nvim-cmp conf
The issue has been fixed by the maintainer.
2022-05-04 23:14:06 +08:00
jdhao
58102f182a fix nvim-cmp issue, see hrsh7th/nvim-cmp#964 2022-05-04 17:11:34 +08:00
jdhao
9e284f58cb add new map 2022-05-03 19:15:33 +08:00
jdhao
a5dc045acc update issue template 2022-05-03 17:00:49 +08:00
jdhao
dd3e9dd2f4 add map to run lua file 2022-05-03 00:59:32 +08:00
jdhao
6784a87e26 update vimtex conf, close #50
Fix deprecated options
2022-05-02 09:48:43 +08:00
jdhao
99637c86f9 update doc 2022-05-01 23:25:15 +08:00
jdhao
3817525441 update hlslens conf 2022-04-29 22:00:10 +08:00
jdhao
4b4331d394 refactor: simplify hlslens conf 2022-04-29 21:51:23 +08:00
jdhao
aaafaf58d6 fix: error when pressing n/N if pattern not present in buffer 2022-04-29 02:21:05 +08:00
jdhao
1b9bd9ceef use vim.keymap for key mappings in lua 2022-04-27 23:38:09 +08:00
jdhao
e043f07b71 update nvim-tree conf 2022-04-27 22:08:25 +08:00
jdhao
b20b21b5dd update LeaderF conf 2022-04-20 01:29:19 +08:00
jdhao
c3ced68bea spell 2022-04-19 13:06:28 +08:00
jdhao
905efeb53f update README 2022-04-17 23:20:30 +08:00
jdhao
a3795cd043 [nvim 0.7] use native lua autocmd for cleaner code 2022-04-16 12:07:48 +08:00
jdhao
b4c55edb44 doc: bump supported version to nvim 0.7.0 2022-04-16 01:04:42 +08:00
jdhao
58b1e0aa9f [nvim 0.7] use filetype.lua for detecting ft 2022-04-16 01:00:36 +08:00
jdhao
f7bb7caba6 [nvim 0.7] vim.keymap.set opts update 2022-04-16 01:00:21 +08:00
jdhao
617fb733d7 [nvim 0.7] use the new vim.keymap interface 2022-04-16 00:17:10 +08:00
jdhao
9082e124a5 [nvim 0.7] no more py2 support 2022-04-16 00:16:23 +08:00
jdhao
2ffba14a6c Merge pull request #48 from soda92/patch-1
fix small typo
2022-04-14 19:20:33 +08:00
Maple
1a36e711df fix small typo 2022-04-14 19:17:17 +08:00
jdhao
4ab3d0414f fix nvim-cmp error
check https://github.com/hrsh7th/nvim-cmp/issues/231#issuecomment-1098175017
2022-04-14 00:14:25 +08:00
jdhao
8059940caa update spell file 2022-04-10 13:27:24 +08:00
jdhao
081c2717b3 update doc 2022-04-10 13:26:49 +08:00
jdhao
1d3bfc5c5f update issue template 2022-04-10 13:26:24 +08:00
jdhao
3c5d7bf0e5 update wilder.nvim conf 2022-04-10 13:23:18 +08:00
jdhao
3134f088cd update nvim-cmp conf, fix hrsh7th/nvim-cmp#880 2022-04-10 13:07:02 +08:00
jdhao
639b3d6067 update tex snippets 2022-04-05 00:43:01 +08:00
jdhao
4f55f53958 chore: use ft for FileType lazyloading 2022-04-03 15:30:47 +08:00
jdhao
085f0eb7e3 update nvim-tree conf: stay focus 2022-04-02 19:48:41 +08:00
jdhao
9f41333378 Merge pull request #46 from jdhao/fix-quit-condition
[fix] quit does not work for 2 windows
2022-03-29 21:46:27 +08:00
jdhao
e9ffd6c39d [fix] quit does not work for 2 windows
If current buf in remaning two or more windows are filetypes in the quit
list, we should also quit nvim also.
2022-03-29 21:41:44 +08:00
jdhao
988cf54f26 update nvim-tree conf 2022-03-29 12:58:52 +08:00
jdhao
9dbeb67de5 [feat] add mapping to add hard linebreak for Markdown 2022-03-27 00:04:39 +08:00
jdhao
36bdde7fc9 update C++ snippets 2022-03-19 14:48:46 +08:00
jdhao
4dd1350f25 working config for cmp-omni and vimtex 2022-03-15 20:25:30 +08:00
jdhao
311768ce72 add cmp-omni for working with tex 2022-03-14 00:34:06 +08:00
jdhao
a1942e6142 update spell 2022-03-08 13:15:38 +08:00
jdhao
e528acd799 update hop.nvim conf 2022-03-07 22:42:32 +08:00
jdhao
3c7b40bc15 add snip for ultisnips snippets files 2022-03-05 22:15:35 +08:00
jdhao
a0179d01c1 add new markdown snippet 2022-03-05 22:15:02 +08:00
jdhao
377c54c88c update tex conf 2022-02-28 23:31:01 +08:00
jdhao
3f78429c81 update spell 2022-02-27 15:52:09 +08:00
jdhao
414a4593ce update config doc 2022-02-14 20:43:00 +08:00
jdhao
aa891f7acd spell update 2022-02-12 22:46:46 +08:00
jdhao
a522cf7c5e update issue template 2022-02-12 14:31:15 +08:00
jdhao
5b7944031e update doc 2022-02-12 14:31:00 +08:00
jdhao
1efec8bc8f update issue template 2022-02-11 21:23:07 +08:00
jdhao
ec6549948a update Markdown snippet 2022-02-11 21:11:27 +08:00
jdhao
528aa2f19a update nvim-cmp conf 2022-02-11 20:15:07 +08:00
jdhao
295f47b1fb fix: wilder.nvim auto-start improvement
Using CursorHold to start wilder.nvim is not ideal, since it depends on
the value of option 'updatetime'. Using a timer may be a better idea.
2022-02-11 19:19:23 +08:00
jdhao
8ce677a50f update spell 2022-02-10 13:17:33 +08:00
jdhao
6322c7c212 chore: update theme hint message 2022-02-09 01:17:50 +08:00
jdhao
aa0cf40591 update Markdown snippets 2022-02-08 23:13:10 +08:00
jdhao
15dfccf81e [breaking change] remove direct reference to fastgit
fastgit may be blocked by GFW (see https://t.me/fastgitchannel/81), so
hard-coding its URL is not a good option. Using git URL rewrite feature
is a better choice: https://jdhao.github.io/2021/11/27/git_notes_s4/#use-a-git-mirror-site-for-cloning.

This is a breaking change, since previously I use hub.fastgit.org as the
url, now the url will be default github.com unless the user change it
using the above mentioned method to change the cloning URL.
2022-02-08 13:11:20 +08:00
jdhao
0aed2b42ac add nvim-tree.lua to readme 2022-02-08 00:11:28 +08:00
jdhao
1e84dd6248 update spell 2022-02-08 00:10:34 +08:00
jdhao
1b937d80af chore: update setup script for Linux 2022-02-06 12:41:23 +08:00
jdhao
78a8804f77 chore: update links for Anaconda/miniconda package 2022-02-06 12:19:04 +08:00
jdhao
6759171794 update ignore setting 2022-02-05 13:44:28 +08:00
jdhao
f357b0bee8 nvim-tree: auto-close when it is the only win 2022-02-05 13:42:53 +08:00
jdhao
2b24d0794e Use nvim-tree as file explorer when we open a folder
netrw plugin needs to be disabled, and nvim-tree needs to be start
package. Otherwise, the hijacking won't work, and when we open a folder,
it just open a new file with the same name.
2022-02-05 13:40:54 +08:00
jdhao
f10f688374 update nvim-tree conf 2022-02-05 12:27:17 +08:00
jdhao
d6b83710c4 enable lualine's support for nvim-tree
See also https://github.com/nvim-lualine/lualine.nvim#extensions.
2022-02-05 12:26:27 +08:00
jdhao
590baf4ca9 add plugin nvim-tree.lua 2022-02-05 00:11:58 +08:00
jdhao
dc4ff3d499 change param for plugin lspkind-nvim
See also 06872e887e.
2022-02-04 23:18:31 +08:00
jdhao
6b76b7781c add comment for ginit.vim 2022-02-04 11:06:38 +08:00
jdhao
21127b3170 update README 2022-02-04 11:02:40 +08:00
jdhao
b542bec561 update logging conf 2022-02-03 17:27:45 +08:00
jdhao
7ce35a0a5f chore: add comment 2022-02-03 12:59:07 +08:00
jdhao
61ae7acc14 refactor: rename 2022-02-03 12:52:30 +08:00
jdhao
d533859af9 update LeaderF conf 2022-02-02 17:08:45 +08:00
jdhao
74e8aed170 update README 2022-01-30 14:11:01 +08:00
jdhao
532e457ad4 update README 2022-01-30 14:04:32 +08:00
jdhao
9555052f94 use debug mode 2022-01-30 11:58:50 +08:00
jdhao
b84d57ccec update README 2022-01-30 02:23:30 +08:00
jdhao
4741291176 update spell 2022-01-29 13:11:24 +08:00
jdhao
38883b3fc5 fix: check if language server exists before using 2022-01-28 13:13:24 +08:00
jdhao
597b11638f chore: use local variable lspconfig 2022-01-28 13:13:01 +08:00
jdhao
694f4d0ca1 add bash-language-server 2022-01-26 22:54:49 +08:00
jdhao
e5c506aae3 update ignore files 2022-01-26 19:12:31 +08:00
jdhao
22eead5d0f update matchparen highlight 2022-01-26 19:10:15 +08:00
jdhao
a6ded3a154 add log-autocmd 2022-01-24 00:16:00 +08:00
jdhao
91b4d85592 change load condition of lspkind-nvim
If we use BufEnter, nvim-cmp autocompletion may not work sometimes,
which is really annoying
2022-01-23 16:47:52 +08:00
jdhao
a19a91397f update spell 2022-01-23 16:14:18 +08:00
jdhao
3928935402 update lsp setting 2022-01-23 16:13:34 +08:00
jdhao
3604449b6a doc: update description for init.vim 2022-01-16 17:22:23 +08:00
jdhao
146ef5d0b8 use lua for may_create_dir 2022-01-13 20:27:48 +08:00
jdhao
6fd7155787 feat: create parent dir of current file if it does not exist 2022-01-13 01:51:19 +08:00
jdhao
665250fe58 new year 2022-01-11 23:59:27 +08:00
jdhao
6a2ded6ca8 add plugin vim-conflicted for merge conflict handling 2022-01-09 22:02:18 +08:00
jdhao
41db6639d6 add issue template for easier debugging 2022-01-09 00:43:01 +08:00
jdhao
1b9b208653 update README 2022-01-09 00:14:37 +08:00
jdhao
97fcc581e6 chore: remove semshi settings
That plugin has been deleted before
2022-01-09 00:08:36 +08:00
jdhao
2e9f5fedfa more startup screen menu item 2022-01-08 15:02:20 +08:00
jdhao
1280c98314 add icon and scrollbar for wilder.nvim 2022-01-07 00:41:14 +08:00
jdhao
9cd43dcba9 simplify wilder.nvim settings 2022-01-07 00:40:48 +08:00
jdhao
d02fd0a69d fix: link is broken for wilder.nvim 2022-01-07 00:40:14 +08:00
jdhao
980fd531a8 wilder.nvim popup menu now respects pumblend
See also https://github.com/gelguy/wilder.nvim/pull/115.
2022-01-06 23:42:23 +08:00
jdhao
148dabd7ad docs: use latest stable version of nvim 2022-01-04 23:31:03 +08:00
jdhao
b9d1f2ee92 remove two mappings that warn of mapping deprecation 2022-01-04 00:40:11 +08:00
jdhao
b2959e8acf docs: update mappings 2022-01-04 00:38:34 +08:00
jdhao
b5ec8d2a91 Update README 2022-01-02 22:50:49 +08:00
jdhao
092ea88703 bump minimum supported nvim version to 0.6.1 2022-01-02 11:26:32 +08:00
jdhao
67d59bfc2c docs: add section on custom commands 2021-12-31 12:30:23 +08:00
jdhao
77a5dfacd6 fix: broken link in README 2021-12-31 12:17:51 +08:00
jdhao
1373c418b9 restore reg content after using it 2021-12-30 23:39:42 +08:00
jdhao
e82b450464 split command output to list of string and set the buffer 2021-12-30 23:39:03 +08:00
jdhao
08818dbf01 remove logging 2021-12-30 23:38:49 +08:00
jdhao
0ed8814aef fix: command output captured by a register not formatted properly
Newline is converted to NUL character, which is nasty, see also https://vi.stackexchange.com/q/6697/15292.
2021-12-30 22:33:39 +08:00
jdhao
a86f1d2f31 refactor: capture command output silently 2021-12-30 22:33:06 +08:00
jdhao
c1b27ee818 fix url link in README 2021-12-29 23:34:59 +08:00
jdhao
7eb7b4450f update README 2021-12-29 23:33:07 +08:00
jdhao
5443078805 g:mapleader 2021-12-29 00:42:00 +08:00
jdhao
dcffbf9a71 fix: lsp reference highlight isn't correctly linked
! is need to overwrite possible existing highlight group of the same
name.
2021-12-28 23:49:43 +08:00
jdhao
85de00f374 refactor: resume edit position --> resume cursor position 2021-12-28 00:11:10 +08:00
jdhao
9adc3fdf16 remove double quotes for snippet trigger 2021-12-23 22:41:16 +08:00
jdhao
6cf31e2dcb add colorscheme kanagawa 2021-12-23 22:36:29 +08:00
jdhao
08d3d7ec08 fix bug in go to last edit position
If a go-to-line command is given, do not go to last edit position for
the file.
2021-12-20 22:15:34 +08:00
jdhao
ed52ca5914 add ref for checking IME state 2021-12-19 20:54:13 +08:00
jdhao
1d0609f753 change SPELL location on statusline 2021-12-19 20:53:09 +08:00
jdhao
56a43e4009 show IME on statusline on macOS 2021-12-19 20:52:23 +08:00
jdhao
22c7c6ee05 update plugin.lua 2021-12-19 19:55:00 +08:00
jdhao
3d0f00e7e4 update README 2021-12-16 23:31:13 +08:00
jdhao
bbd642af1a renaming variables 2021-12-15 00:21:34 +08:00
jdhao
5215a601b9 update fold conf for vim script
When setting foldlevel to 0 and load some plugin via InsertEnter event
using packer.nvim, if we press i to go to insert mode, the fold for vim
script file will be automatically closed. It is really annoying.

I have pinpoint the issue to the combination of packer.nvim and setting
foldlevel to 0 in after/ftplugin/vim.vim. What is interesting is that
default value for foldlevel is also 0. However, if we do not set it in
vim.vim, the above issue won't occur, which is strange.
2021-12-14 21:48:58 +08:00
jdhao
9bac7fa4f7 refactor: remove folding for init.vim 2021-12-14 21:47:59 +08:00
jdhao
06910bac87 remove plugin vim-cool
nvim-hlslens can replace it if calm_down option is enabled.
2021-12-12 17:30:11 +08:00
jdhao
85427c6424 remove plugin semshi 2021-12-12 16:47:58 +08:00
jdhao
cf9761e9a3 update plugin load condition 2021-12-11 18:15:24 +08:00
jdhao
7d3647ac61 remove oo and OO normal mode mapping 2021-12-11 15:47:15 +08:00
jdhao
a466339092 update nvim-hlslens settings 2021-12-11 15:46:25 +08:00
jdhao
6fb30f0cf2 use en_US.utf-8 as default 2021-12-10 22:52:03 +08:00
jdhao
9b41825c2c update lualine conf
diagnostic interface change
2021-12-10 22:51:06 +08:00
jdhao
e9319b0460 update README 2021-12-10 00:48:19 +08:00
jdhao
49596fb5ab update README 2021-12-09 21:41:59 +08:00
jdhao
1d3552860b update nvim setup script for Linux, closes #31 2021-12-08 23:24:46 +08:00
jdhao
17a9488ba7 make impatient.nvim the first plugin 2021-12-06 21:23:59 +08:00
jdhao
683008dac0 update indent-blankline conf 2021-12-06 12:27:00 +08:00
jdhao
9ee4f46240 lazyload lua plugins 2021-12-06 12:26:44 +08:00
jdhao
7735a33a59 remove plugin gutentags
I rarely use it.
2021-12-06 11:40:45 +08:00
jdhao
aacbf56ee5 tweak lualine conf 2021-12-06 11:11:27 +08:00
jdhao
a7be6a58a4 update spell file 2021-12-05 19:51:36 +08:00
jdhao
3432dbbb63 update lualine conf 2021-12-05 16:54:29 +08:00
jdhao
c652796da1 add mixed indent detection for lualine 2021-12-05 16:18:10 +08:00
jdhao
8e46441a36 update lualine conf 2021-12-05 16:09:21 +08:00
jdhao
4d497ec8a7 update lualine conf 2021-12-05 14:59:08 +08:00
jdhao
752dbcbe2d remove mentioning of vim-airline 2021-12-05 14:33:59 +08:00
jdhao
0be331b28e replace vim-airline with lualine
Lualine is now feature-rich and faster than vim-airline.
2021-12-05 14:25:37 +08:00
jdhao
fcfd1e4437 update hop.nvim conf 2021-12-05 14:08:39 +08:00
jdhao
b9efd2b40f update fugitive conf 2021-12-05 11:21:57 +08:00
jdhao
dd61f1da8c more fugitive shortcut 2021-12-05 11:20:34 +08:00
jdhao
9e6a71c32d update cpp snippet 2021-12-04 23:47:50 +08:00
jdhao
50fafcffdb update default value of option 'wrap' 2021-12-04 23:41:56 +08:00
jdhao
b9f1d92564 use main branch of nvim-hlslens 2021-12-04 12:06:10 +08:00
jdhao
dcde6bb47f reduce startup time using impatient.nvim 2021-12-03 22:42:32 +08:00
jdhao
d04fce7bbc update Leaderf rg conf
Suppress permission denied error messages when grepping using ripgrep.
2021-12-02 22:57:41 +08:00
jdhao
39e5e1913f Add command :Datetime to show current time or translate a Unix timestamp 2021-12-02 22:06:40 +08:00
jdhao
80ceacbb02 fix vim.diagnostic.config() option name typo 2021-12-01 23:25:45 +08:00
jdhao
23e98aab6f [v0.6] update doc 2021-12-01 22:19:51 +08:00
jdhao
6069bd8922 [v0.6] update install script to use nvim v0.6 2021-12-01 22:19:03 +08:00
jdhao
402d4012d1 [v0.6] change LSP and diagnostic according to latest API 2021-12-01 22:10:24 +08:00
jdhao
22f16ee325 [v0.6] default value for option inccommand and joinspaces changed 2021-12-01 22:09:43 +08:00
jdhao
ac69b61c03 [v0.6] backupdir will be created by default
No need to create the backupdir manually.
2021-12-01 22:08:45 +08:00
jdhao
0ad051b394 [v0.6] Y is mapped to y$ by default 2021-12-01 22:07:51 +08:00
jdhao
103e051d96 use man for command :Man 2021-11-28 15:17:36 +08:00
jdhao
17995b95a4 refactor: renaming function 2021-11-23 22:55:10 +08:00
jdhao
19cf6cca3c refactor theme loading 2021-11-23 22:43:12 +08:00
jdhao
f996edf016 update LeaderF conf 2021-11-23 22:43:12 +08:00
jdhao
72d8cd07bc update nvim-notify conf 2021-11-23 22:43:12 +08:00
jdhao
1441601ddf remove plugin vim-searchlight
It can be replaced by nvim-hlslens
2021-11-23 22:43:12 +08:00
jdhao
7fe37ffd24 update linux setup script, closes #30 2021-11-23 22:42:17 +08:00
jdhao
e05c93aaeb use branch dev of nvim-hlslens
Master version has a bug where text is wrongly highlighted.
2021-11-22 23:16:25 +08:00
jdhao
5ed4e3610a update linux setup 2021-11-22 21:47:04 +08:00
jdhao
b96a3ce762 update snippets 2021-11-21 23:26:45 +08:00
jdhao
b46a1e7055 reword warning msg 2021-11-21 15:57:41 +08:00
jdhao
927a57452c update packer-related instructions 2021-11-21 15:45:34 +08:00
jdhao
af17364730 update hop.nvim conf 2021-11-17 23:19:36 +08:00
jdhao
46a465508a update snippets 2021-11-10 22:23:51 +08:00
jdhao
e0c406a344 add cpp snippets 2021-11-08 21:57:21 +08:00
jdhao
db3b0024a6 drop auto-remove trailing whitespaces
When working with legacy code which is not well formatted, it will cause
large undesirable diffs.
2021-11-07 13:32:06 +08:00
jdhao
c9535a0feb make alpah-nvim opt 2021-11-07 13:30:47 +08:00
jdhao
2a0a92f134 change location of packer_compiled.lua
Putting this file under ~/.config/nvim/plugin may cause problems since
script under plugin/ will be loaded automatically.
2021-11-07 00:26:18 +08:00
jdhao
62b6226520 fix indent-blankline activation bug
When InsertLeave is triggered, we should check if we need to start
indent-blankline before enabling it.
2021-11-06 23:10:24 +08:00
jdhao
bd92419bf9 remove lsp omnifunc conf
I never used it.
2021-11-06 20:05:54 +08:00
jdhao
6281322fce simplify lsp config 2021-11-06 20:03:21 +08:00
jdhao
538afe2fc6 update indent-blankline conf 2021-11-06 13:09:50 +08:00
72 changed files with 2765 additions and 1292 deletions

40
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,40 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
<!-- Before reporting: make sure that you have read the doc (https://github.com/jdhao/nvim-config/tree/master/docs) and searched existing issues. -->
- `nvim --version`: <!--should be latest stable version: https://github.com/neovim/neovim/releases/tag/stable -->
- terminal emulator and version:
- Operating system/version:
- Have you read and followed all steps in the [doc](https://github.com/jdhao/nvim-config/tree/master/docs):
- Output of command `set runtimepath`:
<!-- paste your runtimepath below --->
```
```
**Describe the bug**
<!-- A clear and concise description of what the bug is. -->
Steps to reproduce the issue:
1.
2.
3.
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Screenshots**
<!-- If applicable, add screenshots to help explain your problem. -->
**Additional context**
<!-- Add any other context about the problem here. -->

View File

@@ -0,0 +1,19 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

3
.gitignore vendored
View File

@@ -2,4 +2,5 @@ tags
en.utf-8.add.spl
*.exe
.netrwhist
packer_compiled.lua
*.log
.DS_Store

6
.stylua.toml Normal file
View File

@@ -0,0 +1,6 @@
# config for stylua, ref: https://github.com/JohnnyMorganz/StyLua
line_endings = "Unix"
indent_type = "Spaces"
indent_width = 2
quote_style = "AutoPreferDouble"
call_parentheses= "NoSingleTable"

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2018-2021 jdhao
Copyright (c) 2018-2022 jdhao
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

157
README.md
View File

@@ -1,77 +1,108 @@
```
███ ██ ██ ██ ██ ███ ███ ██████ ██████ ███ ██ ███████ ██ ██████
████ ██ ██ ██ ██ ████ ████ ██ ██ ██ ████ ██ ██ ██ ██
██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ █████ ██ ██ ███
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ████ ████ ██ ██ ██ ██████ ██████ ██ ████ ██ ██ ██████
```
<div align="center">
<p>
<a>
<img alt="Linux" src="https://img.shields.io/badge/Linux-%23.svg?style=flat-square&logo=linux&color=FCC624&logoColor=black" />
</a>
<a>
<img alt="macOS" src="https://img.shields.io/badge/macOS-%23.svg?style=flat-square&logo=apple&color=000000&logoColor=white" />
</a>
<a>
<img alt="Windows" src="https://img.shields.io/badge/Windows-%23.svg?style=flat-square&logo=windows&color=0078D6&logoColor=white" />
</a>
<a href="https://github.com/jdhao/nvim-config/releases/latest">
<img alt="Latest release" src="https://img.shields.io/github/v/release/jdhao/nvim-config" />
</a>
<a href="https://github.com/neovim/neovim/releases/tag/stable">
<img src="https://img.shields.io/badge/Neovim-0.8.1-blueviolet.svg?style=flat-square&logo=Neovim&logoColor=green" alt="Neovim minimum version"/>
</a>
<a href="https://github.com/jdhao/nvim-config/search?l=vim-script">
<img src="https://img.shields.io/github/languages/top/jdhao/nvim-config" alt="Top languages"/>
</a>
<a href="https://github.com/jdhao/nvim-config/graphs/commit-activity">
<img src="https://img.shields.io/github/commit-activity/m/jdhao/nvim-config?style=flat-square" />
</a>
<a href="https://github.com/jdhao/nvim-config/releases/tag/v0.8.1">
<img src="https://img.shields.io/github/commits-since/jdhao/nvim-config/v0.8.1?style=flat-square" />
</a>
<a href="https://github.com/jdhao/nvim-config/graphs/contributors">
<img src="https://img.shields.io/github/contributors/jdhao/nvim-config?style=flat-square" />
</a>
<a>
<img src="https://img.shields.io/github/repo-size/jdhao/nvim-config?style=flat-square" />
</a>
<a href="https://github.com/jdhao/nvim-config/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/jdhao/nvim-config?style=flat-square&logo=GNU&label=License" alt="License"/>
</a>
</p>
</div>
# Introduction
This repo hosts my Nvim configuration for all the platforms I am using (Linux,
Windows and macOS). `init.vim` is the config entry point for terminal Nvim,
and `ginit.vim` is the additional config file for GUI client of Nvim (I am
using [neovim-qt](https://github.com/equalsraf/neovim-qt) for now on Windows).
This repo hosts my Nvim configuration for Linux, macOS, and Windows.
`init.lua` is the config entry point for terminal Nvim,
and `ginit.vim` is the additional config file for [GUI client of Nvim](https://github.com/neovim/neovim/wiki/Related-projects#gui).
My configurations are heavily documented to make it as clear as possible. While
you can download the whole repository and use it, it is not recommended though.
Good configurations are personal. Everyone should have his or her unique config
file. You are encouraged to copy from this repo the part you feel useful and
add it to your own Nvim config.
My configurations are heavily documented to make it as clear as possible.
While you can clone the whole repository and use it, it is not recommended though.
Good configurations are personal. Everyone should have his or her unique config file.
You are encouraged to copy from this repo the part you want and add it to your own config.
See [doc here](docs/README.md) on how to install Nvim's dependencies, Nvim
itself, and how to set up on different platforms (Linux, macOS and Windows).
To reduce the possibility of breakage, **this config is only maintained for [the latest nvim stable release](https://github.com/neovim/neovim/releases/tag/stable).
No effort is spent on maintaining backward compatibility.**
**This config is tested against Nvim 0.5.1 release. No backward compatibility
is guaranteed.**
# Install and setup
See [doc here](docs/README.md) on how to install Nvim's dependencies, Nvim itself,
and how to set up on different platforms (Linux, macOS, and Windows).
# Features #
+ Plugin management via [Packer.nvim](https://github.com/wbthomason/packer.nvim).
+ Code auto-completion via [nvim-cmp](https://github.com/hrsh7th/nvim-cmp) and [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig).
+ Code, snippet, word auto-completion via [nvim-cmp](https://github.com/hrsh7th/nvim-cmp).
+ Language server protocol (LSP) support via [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig).
+ Git integration via [vim-fugitive](https://github.com/tpope/vim-fugitive).
+ Better escaping from insert mode via [better-escape.vim](https://github.com/jdhao/better-escape.vim).
+ Better escaping from insert mode via [better-escape.vim](https://github.com/nvim-zh/better-escape.vim).
+ Ultra-fast project-wide fuzzy searching via [LeaderF](https://github.com/Yggdroot/LeaderF).
+ Faster code commenting via [vim-commentary](https://github.com/tpope/vim-commentary).
+ Faster matching pair insertion and jump via [delimitMate](https://github.com/Raimondi/delimitMate).
+ Smarter and faster matching pair management (add, replace or delete) via [vim-sandwich](https://github.com/machakann/vim-sandwich).
+ Fast buffer jump via [hop.nvim](https://github.com/phaazon/hop.nvim).
+ Ultra fast snippet insertion via [Ultisnips](https://github.com/SirVer/ultisnips).
+ Beautiful status line via [vim-airline](https://github.com/vim-airline/vim-airline).
+ Powerful snippet insertion via [Ultisnips](https://github.com/SirVer/ultisnips).
+ Beautiful statusline via [lualine.nvim](https://github.com/nvim-lualine/lualine.nvim).
+ File tree explorer via [nvim-tree.lua](https://github.com/kyazdani42/nvim-tree.lua).
+ Better quickfix list with [nvim-bqf](https://github.com/kevinhwang91/nvim-bqf).
+ Show search index and count with [nvim-hlslens](https://github.com/kevinhwang91/nvim-hlslens).
+ Command line auto-completion via [wilder.nvim](https://github.com/gelguy/wilder.nvim).
+ Keymap display via [which-key.nvim](https://github.com/folke/which-key.nvim).
+ User-defined mapping hint via [which-key.nvim](https://github.com/folke/which-key.nvim).
+ Asynchronous code execution via [asyncrun.vim](https://github.com/skywind3000/asyncrun.vim).
+ Code highlighting via [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter).
+ Code editing using true nvim inside browser via [firenvim](https://github.com/glacambre/firenvim).
+ Color theme via [vim-gruvbox8](https://github.com/lifepillar/vim-gruvbox8) and other beautiful themes.
+ Markdown writing and previewing via [vim-markdown](https://github.com/plasticboy/vim-markdown) and [markdown-preview.nvim](https://github.com/iamcco/markdown-preview.nvim).
+ Beautiful colorscheme via [sainnhe/gruvbox-material](https://github.com/sainnhe/gruvbox-material) and other colorschemes.
+ Markdown writing and previewing via [vim-markdown](https://github.com/preservim/vim-markdown) and [markdown-preview.nvim](https://github.com/iamcco/markdown-preview.nvim).
+ LaTeX editing and previewing via [vimtex](https://github.com/lervag/vimtex)
+ Animated GUI style notification via [nvim-notify](https://github.com/rcarriga/nvim-notify).
+ Smooth scroll experience via [neoscroll](https://github.com/karb94/neoscroll.nvim).
+ Tags navigation via [vista](https://github.com/liuchengxu/vista.vim).
+ Code formatting via [Neoformat](https://github.com/sbdchd/neoformat).
+ Undo management via [vim-mundo](https://github.com/simnalamburt/vim-mundo)
+ LaTeX editing via [vimtex](https://github.com/lervag/vimtex) <sup id="a1">[1](#f1)</sup>.
+ ......
# UI Demo
For more UI demos, see [here](https://github.com/jdhao/nvim-config/issues/15).
For more UI demos, check [here](https://github.com/jdhao/nvim-config/issues/15).
## Start screen with alpha-nvim
## Start screen with dashboard-nvim
<p align="center">
<img src="https://user-images.githubusercontent.com/16662357/139459989-0537ded4-c119-4749-99bf-b551ca1ba118.jpg" width="800">
<img src="https://user-images.githubusercontent.com/16662357/183256752-fb23b215-a6b8-4646-beed-9999f52d53f1.png" width="800">
</p>
## fuzzy finding using LeaderF
## File fuzzy finding using LeaderF
<p align="center">
<img src="https://user-images.githubusercontent.com/16662357/139462025-7bce98c5-d2d5-413f-9659-20545865cdca.gif" width="800">
<img src="https://user-images.githubusercontent.com/16662357/183257017-2d9d7605-3c4b-4e1d-8955-30998f9b6f28.gif" width="800">
</p>
## Autocompletion
## Code autocompletion with nvim-cmp
<p align="center">
<img src="https://user-images.githubusercontent.com/16662357/128590006-0fc1451f-fac1-49b2-bb95-8aba21bfa44e.gif" width="800">
@@ -83,6 +114,12 @@ For more UI demos, see [here](https://github.com/jdhao/nvim-config/issues/15).
<img src="https://user-images.githubusercontent.com/16662357/128590833-aaa05d53-19ef-441d-a5a9-ba1bbd3936c1.gif" width="800">
</p>
## Command-line autocompletion with wilder.nvim
<p align="center">
<img src="https://user-images.githubusercontent.com/16662357/147677787-8e5d229a-a16a-420e-98f5-88f2a1be84a2.gif" width="800">
</p>
## Tags
<p align="center">
@@ -97,20 +134,18 @@ Go to a string starting with `se`
<img src="https://user-images.githubusercontent.com/16662357/139459219-8a7e6ac4-1d24-4008-a370-b56773d7cb85.gif" width="800">
</p>
## GUI-style notification
## GUI-style notification with nvim-notify
<p align="center">
<img src="https://user-images.githubusercontent.com/16662357/128589873-aadb8264-1098-4834-9876-fa66a309be05.gif" width="800">
</p>
# Shortcuts
Some of the shortcuts I use frequently. In the following shortcuts, `<leader>`
represents ASCII character `,`.
Some of the shortcuts I use frequently are listed here. In the following shortcuts, `<leader>` represents ASCII character `,`.
| Shortcut | Mode | platform | Description |
|-------------------|---------------|-----------------|------------------------------------------------------------------|
|-------------------|---------------|-----------------|--------------------------------------------------------------------------|
| `<leader>ff` | Normal | Linux/macOS/Win | Fuzzy file searching in a floating window |
| `<leader>fh` | Normal | Linux/macOS/Win | Fuzzy help file grepping in a floating window |
| `<leader>fg` | Normal | Linux/macOS/Win | Fuzzy project-wide grepping in a floating window |
@@ -124,19 +159,27 @@ represents ASCII character `,`.
| `<leader>q` | Normal | Linux/macOS/Win | Quit current window |
| `<leader>Q` | Normal | Linux/macOS/Win | Quit all window and close Nvim |
| `<leader>w` | Normal | Linux/macOS/Win | Save current buffer content |
| `<leader>cd` | Normal | Linux/macOS/Win | Change current directory to where current file is |
| `<leader>y` | Normal | Linux/macOS/Win | Copy the content of entire buffer to default register |
| `<leader>cl` | Normal | Linux/macOS/Win | Toggle cursor column |
| `<leader>cd` | Normal | Linux/macOS/Win | Change current working directory to to the dir of current buffer |
| `<space>t` | Normal | Linux/macOS/Win | Toggle tag window (show project tags in the right window) |
| `<leader>gs` | Normal | Linux/macOS/Win | Show Git status result |
| `<leader>gw` | Normal | Linux/macOS/Win | Run Git add for current file |
| `<leader>gd` | Normal | Linux/macOS/Win | Run git diff for current file |
| `<leader>gc` | Normal | Linux/macOS/Win | Run git commit |
| `<F9>` | Normal | Linux/macOS/Win | Run current source file (for Python, C++) |
| `<leader>gpl` | Normal | Linux/macOS/Win | Run git pull |
| `<leader>gpu` | Normal | Linux/macOS/Win | Run git push |
| `<leader>gl` | Normal/Visual | Linux/macOS/Win | Get perm link for current/visually-select lines
| `<leader>gb` | Normal | macOS | Browse current git repo in browser
| `<F9>` | Normal | Linux/macOS/Win | Compile&run current source file (for C++, LaTeX, Lua, Python) |
| `<F11>` | Normal | Linux/macOS/Win | Toggle spell checking |
| `<F12>` | Normal | Linux/macOS/Win | Toggle paste mode |
| `\x` | Normal | Linux/macOS/Win | Close location or quickfix window |
| `\d` | Normal | Linux/macOS/Win | Close current buffer and go to previous buffer |
| `{count}gb` | Normal | Linux/macOS/Win | Go to buffer {count} or next buffer in the buffer list. |
| `{count}gb` | Normal | Linux/macOS/Win | Go to buffer `{count}` or next buffer in the buffer list. |
| `{operator}iB` | Normal | Linux/macOS/Win | Operate in the whole buffer, `{operator}` can be `v`, `y`, `c`, `d` etc. |
| `Alt-k` | Normal | Linux/macOS/Win | Move current line or selected lines up |
| `Alt-j` | Normal | Linux/macOS/Win | Move current line or selected lines down |
| `Alt-m` | Normal | macOS/Win | Markdown previewing in system browser |
| `Alt-Shift-m` | Normal | macOS/Win | Stopping Markdown previewing in system browser |
| `ob` | Normal/Visual | macOS/Win | Open link under cursor or search visual selection |
@@ -144,22 +187,32 @@ represents ASCII character `,`.
| `ctrl-t` | Insert | Linux/macOS/Win | Turn word under cursor to title case |
| `jk` | Insert | Linux/macOS/Win | Return to Normal mode without lagging |
# Trouble shooting
# Custom commands
If you come across an issue, you can first use `:checkhealth` command provided
by `nvim` to trouble-shoot yourself. Please read carefully the messages
provided by health check.
In addition to commands provided by various plugins, I have also created some custom commands for personal use.
| command | description | example |
|------------|-------------------------------------------------------------------------|--------------------------------|
| `Redir` | capture command output to a tabpage for easier inspection. | `Redir hi` |
| `Edit` | edit multiple files at the same time, supports globing | `Edit *.vim` |
| `Datetime` | print current date and time or convert Unix time stamp to date and time | `Datetime 12345` or `Datetime` |
# Contributing
If you find anything that needs improving, do not hesitate to point it out or create a PR.
If you come across an issue, you can first use `:checkhealth` command provided by `nvim` to trouble-shoot yourself.
Please read carefully the messages provided by health check.
If you still have an issue, [open a new issue](https://github.com/jdhao/nvim-config/issues).
# Further readings
Some of the resources that I find helpful in mastering Vim is documented [here](docs/vim_resources.md).
You may also be interested in my post in configuring Vim on different platforms:
Some of the resources that I find helpful in mastering Nvim is documented [here](docs/nvim_resources.md).
You may also be interested in my posts on configuring Nvim:
+ My nvim notes can be found [here](https://jdhao.github.io/categories/Nvim/)
+ [Using Neovim for Three years](https://jdhao.github.io/2021/12/31/using_nvim_after_three_years/)
+ [Config nvim on Linux for Python development](https://jdhao.github.io/2018/12/24/centos_nvim_install_use_guide_en/)
+ [Nvim config on Windows 10](https://jdhao.github.io/2018/11/15/neovim_configuration_windows/)
+ [Nvim-qt config on Windows 10](https://jdhao.github.io/2019/01/17/nvim_qt_settings_on_windows/)
+ My nvim notes can be found [here](https://jdhao.github.io/categories/Nvim/)
<b id="f1">1:</b> Not enabled by default for Linux, see [this issue](https://github.com/jdhao/nvim-config/issues/4) on how to enable vimtex on Linux. [](#a1)

View File

@@ -1,10 +1,5 @@
set commentstring=//\ %s
set tabstop=2 " number of visual spaces per TAB
set softtabstop=2 " number of spaces in tab when editing
set shiftwidth=2 " number of spaces to use for autoindent
set expandtab " expand tab to spaces so that tabs are spaces
" Disable inserting comment leader after hitting o or O or <Enter>
set formatoptions-=o
set formatoptions-=r

View File

@@ -0,0 +1 @@
set commentstring=#\ %s

View File

@@ -0,0 +1,3 @@
" Disable inserting comment leader after hitting o or O or <Enter>
set formatoptions-=o
set formatoptions-=r

View File

@@ -2,7 +2,7 @@
set formatoptions-=o
set formatoptions-=r
set tabstop=2 " number of visual spaces per TAB
set softtabstop=2 " number of spaces in tab when editing
set shiftwidth=2 " number of spaces to use for autoindent
set expandtab " expand tab to spaces so that tabs are spaces
nnoremap <buffer><silent> <F9> :luafile %<CR>
" For delimitMate
let b:delimitMate_matchpairs = "(:),[:],{:}"

View File

@@ -1,6 +1,8 @@
set concealcursor=c
set synmaxcol=3000 " For long Chinese paragraphs
set wrap
" Fix minor issue with footnote, see https://github.com/vim-pandoc/vim-markdownfootnotes/issues/22
if exists(':FootnoteNumber')
nnoremap <buffer><silent> ^^ :<C-U>call markdownfootnotes#VimFootnotes('i')<CR>
@@ -43,3 +45,25 @@ function! AddListSymbol(type, ...) abort
call setline(line, new_text)
endfor
endfunction
" Add hard line breaks for Markdown
nnoremap <buffer><silent> \ :set operatorfunc=AddLineBreak<CR>g@
xnoremap <buffer><silent> \ :<C-U> call AddLineBreak(visualmode(), 1)<CR>
function! AddLineBreak(type, ...) abort
if a:0
let line_start = line("'<")
let line_end = line("'>")
else
let line_start = line("'[")
let line_end = line("']")
endif
for line in range(line_start, line_end)
let text = getline(line)
" add backslash to each line
let new_text = text . "\\"
call setline(line, new_text)
endfor
endfunction

View File

@@ -8,5 +8,10 @@ set sidescroll=5
set sidescrolloff=2
set colorcolumn=100
set tabstop=4 " number of visual spaces per TAB
set softtabstop=4 " number of spaces in tab when editing
set shiftwidth=4 " number of spaces to use for autoindent
set expandtab " expand tab to spaces so that tabs are spaces
" For delimitMate
let b:delimitMate_matchpairs = "(:),[:],{:}"

1
after/ftplugin/sql.vim Normal file
View File

@@ -0,0 +1 @@
set commentstring=--\ %s

2
after/ftplugin/tex.lua Normal file
View File

@@ -0,0 +1,2 @@
vim.o.textwidth = 120
vim.o.wrap = true

View File

@@ -1 +0,0 @@
set textwidth=79

View File

@@ -1,4 +0,0 @@
set tabstop=2 " number of visual spaces per TAB
set softtabstop=2 " number of spaces in tab when editing
set shiftwidth=2 " number of spaces to use for autoindent
set expandtab " expand tab to spaces so that tabs are spaces

View File

@@ -6,14 +6,10 @@ set formatoptions-=r
" modeline is annoying in that the modeline get executed each time the window
" focus is lost (see
" https://github.com/tmux-plugins/vim-tmux-focus-events/issues/14)
set foldmethod=expr foldlevel=0 foldlevelstart=-1
\ foldexpr=utils#VimFolds(v:lnum) foldtext=utils#MyFoldText()
set foldmethod=expr foldexpr=utils#VimFolds(v:lnum) foldtext=utils#MyFoldText()
" Use :help command for keyword when pressing `K` in vim file,
" see `:h K` and https://stackoverflow.com/q/15867323/6064933
set keywordprg=:help
set tabstop=2 " number of visual spaces per TAB
set softtabstop=2 " number of spaces in tab when editing
set shiftwidth=2 " number of spaces to use for autoindent
set expandtab " expand tab to spaces so that tabs are spaces
nnoremap <buffer><silent> <F9> :source %<CR>

View File

@@ -1,8 +1,3 @@
set tabstop=2 " number of visual spaces per TAB
set softtabstop=2 " number of spaces in tab when editing
set shiftwidth=2 " number of spaces to use for autoindent
set expandtab " expand tab to spaces so that tabs are spaces
" Turn off syntax highlighting for large YAML files.
if line('$') > 500
setlocal syntax=OFF

View File

@@ -15,7 +15,7 @@ function! buf_utils#GoToBuffer(count, direction) abort
" we are essentially mixing Lua and vim script. We need to make sure that
" args inside vim.notify() are valid vim values. The conversion from vim
" value to lua value will be done by Nvim. See also https://github.com/neovim/neovim/pull/11338.
call v:lua.vim.notify('Invalid bufnr: ' . a:count, 'error', {'title': 'nvim-config'})
call v:lua.vim.notify('Invalid bufnr: ' . a:count, 4, {'title': 'nvim-config'})
return
endif

View File

@@ -27,27 +27,6 @@ function! utils#HasColorscheme(name) abort
return !empty(globpath(&runtimepath, l:pat))
endfunction
" Check if an Airline theme exists in runtimepath.
function! utils#HasAirlinetheme(name) abort
let l:pat = printf('autoload/airline/themes/%s.vim', a:name)
return !empty(globpath(&runtimepath, l:pat))
endfunction
" Generate random integers in the range [Low, High] in pure vim script,
" adapted from https://stackoverflow.com/a/12739441/6064933
function! utils#RandInt(Low, High) abort
" Use lua to generate random int. It is faster. Ref: https://stackoverflow.com/a/20157671/6064933
call v:lua.math.randomseed(localtime())
return v:lua.math.random(a:Low, a:High)
endfunction
" Selection a random element from a sequence/list
function! utils#RandElement(seq) abort
let l:idx = utils#RandInt(0, len(a:seq)-1)
return a:seq[l:idx]
endfunction
" Custom fold expr, adapted from https://vi.stackexchange.com/a/9094/15292
function! utils#VimFolds(lnum) abort
" get content of current line and the line below
@@ -137,16 +116,22 @@ function! utils#Get_titlestr() abort
if g:is_linux
let l:title_str = hostname() . ' '
endif
let l:title_str = l:title_str . expand('%:p:~') . ' '
if &buflisted
let l:title_str = l:title_str . strftime('%Y-%m-%d %H:%M',getftime(expand('%')))
let l:buf_path = expand('%:p:~')
let l:title_str = l:title_str . l:buf_path . ' '
if &buflisted && l:buf_path != ""
let l:title_str = l:title_str . strftime('%Y-%m-%d %H:%M:%S%z', getftime(expand('%')))
endif
return l:title_str
endfunction
" Output current time in ISO format.
function! utils#iso_time() abort
" Output current time or unix timestamp in human-readable format.
function! utils#iso_time(timestamp) abort
if a:timestamp
return strftime('%Y-%m-%d %H:%M:%S%z', a:timestamp)
endif
return strftime('%Y-%m-%d %H:%M:%S%z')
endfunction
@@ -156,7 +141,7 @@ function! utils#Inside_git_repo() abort
if match(res, 'true') == -1
return v:false
else
" Manually trigger a specical user autocmd InGitRepo (to use it for
" Manually trigger a special user autocmd InGitRepo (to use it for
" lazyloading of fugitive by packer.nvim).
" See also https://github.com/wbthomason/packer.nvim/discussions/534.
doautocmd User InGitRepo
@@ -176,13 +161,18 @@ endfunction
" Redirect command output to a register for later processing.
" Ref: https://stackoverflow.com/q/2573021/6064933 and https://unix.stackexchange.com/q/8101/221410 .
function! utils#CaptureCommandOutput(command) abort
let l:tmp = @m
redir @m
execute a:command
silent! execute a:command
redir END
call v:lua.vim.notify("command output captured to register m", "info", {'title': 'nvim-config'})
"create a scratch buffer for dumping the text, ref: https://vi.stackexchange.com/a/11311/15292.
tabnew | setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile
call nvim_buf_set_lines(0, 0, 0, 0, [@m])
let l:lines = split(@m, '\n')
call nvim_buf_set_lines(0, 0, 0, 0, l:lines)
let @m = l:tmp
endfunction
" Edit all files matching the given patterns.

View File

@@ -19,32 +19,27 @@ augroup accurate_syn_highlight
autocmd BufEnter * :syntax sync fromstart
augroup END
" Return to last edit position when opening a file
augroup resume_edit_position
" Return to last cursor position when opening a file
augroup resume_cursor_position
autocmd!
autocmd BufReadPost *
\ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit' | execute "normal! g`\"zvzz" | endif
autocmd BufReadPost * call s:resume_cursor_position()
augroup END
" Display a message when the current file is not in utf-8 format.
" Note that we need to use `unsilent` command here because of this issue:
" https://github.com/vim/vim/issues/4379
augroup non_utf8_file_warn
autocmd!
" we can not use `lua vim.notify()`: it will error out E5107 parsing lua.
autocmd BufRead * if &fileencoding != 'utf-8' | call v:lua.vim.notify('File not in UTF-8 format!', 'warn', {'title': 'nvim-config'}) | endif
augroup END
" Only resume last cursor position when there is no go-to-line command (something like '+23').
function s:resume_cursor_position() abort
if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit'
let l:args = v:argv " command line arguments
for l:cur_arg in l:args
" Check if a go-to-line command is given.
let idx = match(l:cur_arg, '\v^\+(\d){1,}$')
if idx != -1
return
endif
endfor
" Automatically reload the file if it is changed outside of Nvim, see
" https://unix.stackexchange.com/a/383044/221410. It seems that `checktime`
" command does not work in command line. We need to check if we are in command
" line before executing this command. See also
" https://vi.stackexchange.com/a/20397/15292.
augroup auto_read
autocmd!
autocmd FileChangedShellPost * call v:lua.vim.notify("File changed on disk. Buffer reloaded!", 'warn', {'title': 'nvim-config'})
autocmd FocusGained,CursorHold * if getcmdwintype() == '' | checktime | endif
augroup END
execute "normal! g`\"zvzz"
endif
endfunction
augroup numbertoggle
autocmd!
@@ -70,15 +65,9 @@ function! s:custom_highlight() abort
highlight FloatBorder guifg=LightGreen guibg=NONE
" highlight for matching parentheses
highlight MatchParen cterm=bold,reverse,underline gui=bold,reverse,underline
highlight MatchParen cterm=bold,underline gui=bold,underline
endfunction
" highlight yanked region, see `:h lua-highlight`
augroup highlight_yank
autocmd!
au TextYankPost * silent! lua vim.highlight.on_yank{higroup="YankColor", timeout=300, on_visual=false}
augroup END
augroup auto_close_win
autocmd!
autocmd BufEnter * call s:quit_current_win()
@@ -86,10 +75,22 @@ augroup END
" Quit Nvim if we have only one window, and its filetype match our pattern.
function! s:quit_current_win() abort
let quit_filetypes = ['qf', 'vista']
let buftype = getbufvar(bufnr(), '&filetype')
if winnr('$') == 1 && index(quit_filetypes, buftype) != -1
quit
let l:quit_filetypes = ['qf', 'vista', 'NvimTree']
let l:should_quit = v:true
let l:tabwins = nvim_tabpage_list_wins(0)
for w in l:tabwins
let l:buf = nvim_win_get_buf(w)
let l:bf = getbufvar(l:buf, '&filetype')
if index(l:quit_filetypes, l:bf) == -1
let l:should_quit = v:false
endif
endfor
if l:should_quit
qall
endif
endfunction
@@ -98,14 +99,25 @@ augroup git_repo_check
autocmd VimEnter,DirChanged * call utils#Inside_git_repo()
augroup END
" Auto-generate packer_compiled.lua file
augroup packer_auto_compile
" ref: https://vi.stackexchange.com/a/169/15292
function! s:handle_large_file() abort
let g:large_file = 10485760 " 10MB
let f = expand("<afile>")
if getfsize(f) > g:large_file || getfsize(f) == -2
set eventignore+=all
" turning off relative number helps a lot
set norelativenumber
setlocal noswapfile bufhidden=unload buftype=nowrite undolevels=-1
else
set eventignore-=all relativenumber
endif
endfunction
augroup LargeFile
autocmd!
autocmd BufWritePost */nvim/lua/plugins.lua source <afile> | PackerCompile
autocmd BufReadPre * call s:handle_large_file()
augroup END
" Remove trailing whitespaces
augroup strip_trailing_space
autocmd!
autocmd BufWritePre,TextChanged * StripTrailingWhitespace
augroup END
" Load auto-command defined in Lua
lua require("custom-autocmd")

157
core/colorschemes.lua Normal file
View File

@@ -0,0 +1,157 @@
--- This module will load a random colorscheme on nvim startup process.
local utils = require("utils")
local M = {}
-- Colorscheme to its directory name mapping, because colorscheme repo name is not necessarily
-- the same as the colorscheme name itself.
M.colorscheme2dir = {
onedark = "onedark.nvim",
edge = "edge",
sonokai = "sonokai",
gruvbox_material = "gruvbox-material",
nord = "nord.nvim",
everforest = "everforest",
nightfox = "nightfox.nvim",
kanagawa = "kanagawa.nvim",
catppuccin = "catppuccin",
rose_pine = "rose-pine",
onedarkpro = "onedarkpro.nvim",
monokai = "monokai.nvim",
material = "material.nvim",
}
M.gruvbox8 = function()
-- Italic options should be put before colorscheme setting,
-- see https://github.com/morhetz/gruvbox/wiki/Terminal-specific#1-italics-is-disabled
vim.g.gruvbox_italics = 1
vim.g.gruvbox_italicize_strings = 1
vim.g.gruvbox_filetype_hi_groups = 1
vim.g.gruvbox_plugin_hi_groups = 1
vim.cmd([[colorscheme gruvbox8_hard]])
end
M.onedark = function()
vim.cmd([[colorscheme onedark]])
end
M.edge = function()
vim.g.edge_enable_italic = 1
vim.g.edge_better_performance = 1
vim.cmd([[colorscheme edge]])
end
M.sonokai = function()
vim.g.sonokai_enable_italic = 1
vim.g.sonokai_better_performance = 1
vim.cmd([[colorscheme sonokai]])
end
M.gruvbox_material = function()
-- foreground option can be material, mix, or original
vim.g.gruvbox_material_foreground = "material"
--background option can be hard, medium, soft
vim.g.gruvbox_material_background = "soft"
vim.g.gruvbox_material_enable_italic = 1
vim.g.gruvbox_material_better_performance = 1
vim.cmd([[colorscheme gruvbox-material]])
end
M.nord = function()
vim.cmd([[colorscheme nord]])
end
M.doom_one = function()
vim.cmd([[colorscheme doom-one]])
end
M.everforest = function()
vim.g.everforest_enable_italic = 1
vim.g.everforest_better_performance = 1
vim.cmd([[colorscheme everforest]])
end
M.nightfox = function()
vim.cmd([[colorscheme nordfox]])
end
M.kanagawa = function()
vim.cmd([[colorscheme kanagawa]])
end
M.catppuccin = function()
-- available option: latte, frappe, macchiato, mocha
vim.g.catppuccin_flavour = "frappe"
require("catppuccin").setup()
vim.cmd([[colorscheme catppuccin]])
end
M.rose_pine = function()
require('rose-pine').setup({
--- @usage 'main' | 'moon'
dark_variant = 'moon',
})
-- set colorscheme after options
vim.cmd('colorscheme rose-pine')
end
M.onedarkpro = function()
require("onedarkpro").setup({
dark_theme = "onedark", -- The default dark theme
})
-- set colorscheme after options
vim.cmd('colorscheme onedarkpro')
end
M.monokai = function()
vim.cmd('colorscheme monokai_pro')
end
M.material = function ()
vim.g.material_style = "oceanic"
vim.cmd('colorscheme material')
end
--- Use a random colorscheme from the pre-defined list of colorschemes.
M.rand_colorscheme = function()
local colorscheme = utils.rand_element(vim.tbl_keys(M.colorscheme2dir))
if not vim.tbl_contains(vim.tbl_keys(M), colorscheme) then
local msg = "Invalid colorscheme: " .. colorscheme
vim.notify(msg, vim.log.levels.ERROR, { title = "nvim-config" })
return
end
-- Load the colorscheme, because all the colorschemes are declared as opt plugins, so the colorscheme isn't loaded yet.
local status = utils.add_pack(M.colorscheme2dir[colorscheme])
if not status then
local msg = string.format("Colorscheme %s is not installed. Run PackerSync to install.", colorscheme)
vim.notify(msg, vim.log.levels.ERROR, { title = "nvim-config" })
return
end
-- Load the colorscheme and its settings
M[colorscheme]()
if vim.g.logging_level == "debug" then
local msg = "Colorscheme: " .. colorscheme
vim.notify(msg, vim.log.levels.DEBUG, { title = "nvim-config" })
end
end
-- Load a random colorscheme
M.rand_colorscheme()

75
core/globals.lua Normal file
View File

@@ -0,0 +1,75 @@
local fn = vim.fn
local api = vim.api
local utils = require('utils')
-- Inspect something
function _G.inspect(item)
vim.pretty_print(item)
end
------------------------------------------------------------------------
-- custom variables --
------------------------------------------------------------------------
vim.g.is_win = (utils.has("win32") or utils.has("win64")) and true or false
vim.g.is_linux = (utils.has("unix") and (not utils.has("macunix"))) and true or false
vim.g.is_mac = utils.has("macunix") and true or false
vim.g.logging_level = "info"
------------------------------------------------------------------------
-- builtin variables --
------------------------------------------------------------------------
vim.g.loaded_perl_provider = 0 -- Disable perl provider
vim.g.loaded_ruby_provider = 0 -- Disable ruby provider
vim.g.loaded_node_provider = 0 -- Disable node provider
vim.g.did_install_default_menus = 1 -- do not load menu
if utils.executable('python3') then
if vim.g.is_win then
vim.g.python3_host_prog = fn.substitute(fn.exepath("python3"), ".exe$", '', 'g')
else
vim.g.python3_host_prog = fn.exepath("python3")
end
else
api.nvim_err_writeln("Python3 executable not found! You must install Python3 and set its PATH correctly!")
return
end
-- Custom mapping <leader> (see `:h mapleader` for more info)
vim.g.mapleader = ','
-- Enable highlighting for lua HERE doc inside vim script
vim.g.vimsyn_embed = 'l'
-- Use English as main language
vim.cmd [[language en_US.UTF-8]]
-- Disable loading certain plugins
-- Whether to load netrw by default, see https://github.com/bling/dotvim/issues/4
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
vim.g.netrw_liststyle = 3
if vim.g.is_win then
vim.g.netrw_http_cmd = "curl --ssl-no-revoke -Lo"
end
-- Do not load tohtml.vim
vim.g.loaded_2html_plugin = 1
-- Do not load zipPlugin.vim, gzip.vim and tarPlugin.vim (all these plugins are
-- related to checking files inside compressed files)
vim.g.loaded_zipPlugin = 1
vim.g.loaded_gzip = 1
vim.g.loaded_tarPlugin = 1
-- Do not load the tutor plugin
vim.g.loaded_tutor_mode_plugin = 1
-- Do not use builtin matchit.vim and matchparen.vim since we use vim-matchup
vim.g.loaded_matchit = 1
vim.g.loaded_matchparen = 1
-- Disable sql omni completion, it is broken.
vim.g.loaded_sql_completion = 1

View File

@@ -1,68 +0,0 @@
"{ Global Variable
"{{ Custom variables
let g:is_win = (has('win32') || has('win64')) ? v:true : v:false
let g:is_linux = (has('unix') && !has('macunix')) ? v:true : v:false
let g:is_mac = has('macunix') ? v:true : v:false
let g:logging_level = 'info'
"}}
"{{ Builtin variables
" Disable Python2 support
let g:loaded_python_provider = 0
" Disable perl provider
let g:loaded_perl_provider = 0
" Disable ruby provider
let g:loaded_ruby_provider = 0
" Disable node provider
let g:loaded_node_provider = 0
let g:did_install_default_menus = 1 " do not load menu
" Path to Python 3 interpreter (must be an absolute path), make startup
" faster. See https://neovim.io/doc/user/provider.html.
if executable('python')
if g:is_win
let g:python3_host_prog=substitute(exepath('python'), '.exe$', '', 'g')
elseif g:is_linux || g:is_mac
let g:python3_host_prog=exepath('python')
endif
else
echoerr 'Python 3 executable not found! You must install Python 3 and set its PATH correctly!'
endif
" Custom mapping <leader> (see `:h mapleader` for more info)
let mapleader = ','
" Enable highlighting for lua HERE doc inside vim script
let g:vimsyn_embed = 'l'
"}}
"{{ Disable loading certain plugins
" Whether to load netrw by default, see
" https://github.com/bling/dotvim/issues/4
" let g:loaded_netrw = 0
" let g:loaded_netrwPlugin = 0
let g:netrw_liststyle = 3
if g:is_win
let g:netrw_http_cmd = 'curl --ssl-no-revoke -Lo'
endif
" Do not load tohtml.vim
let g:loaded_2html_plugin = 1
" Do not load zipPlugin.vim, gzip.vim and tarPlugin.vim (all these plugins are
" related to checking files inside compressed files)
let g:loaded_zipPlugin = 1
let loaded_gzip = 1
let g:loaded_tarPlugin = 1
let g:loaded_tutor_mode_plugin = 1 " do not load the tutor plugin
" Do not use builtin matchit.vim and matchparen.vim since we use vim-matchup
let g:loaded_matchit = 1
let g:loaded_matchparen = 1
"}}
"}

245
core/mappings.lua Normal file
View File

@@ -0,0 +1,245 @@
local keymap = vim.keymap
local api = vim.api
local uv = vim.loop
-- Save key strokes (now we do not need to press shift to enter command mode).
keymap.set({ "n", "x" }, ";", ":")
-- Turn the word under cursor to upper case
keymap.set("i", "<c-u>", "<Esc>viwUea")
-- Turn the current word into title case
keymap.set("i", "<c-t>", "<Esc>b~lea")
-- Paste non-linewise text above or below current line, see https://stackoverflow.com/a/1346777/6064933
keymap.set("n", "<leader>p", "m`o<ESC>p``", { desc = "paste below current line" })
keymap.set("n", "<leader>P", "m`O<ESC>p``", { desc = "paste above current line" })
-- Shortcut for faster save and quit
keymap.set("n", "<leader>w", "<cmd>update<cr>", { silent = true, desc = "save buffer" })
-- Saves the file if modified and quit
keymap.set("n", "<leader>q", "<cmd>x<cr>", { silent = true, desc = "quit current window" })
-- Quit all opened buffers
keymap.set("n", "<leader>Q", "<cmd>qa!<cr>", { silent = true, desc = "quit nvim" })
-- Navigation in the location and quickfix list
keymap.set("n", "[l", "<cmd>lprevious<cr>zv", { silent = true, desc = "previous location item" })
keymap.set("n", "]l", "<cmd>lnext<cr>zv", { silent = true, desc = "next location item" })
keymap.set("n", "[L", "<cmd>lfirst<cr>zv", { silent = true, desc = "first location item" })
keymap.set("n", "]L", "<cmd>llast<cr>zv", { silent = true, desc = "last location item" })
keymap.set("n", "[q", "<cmd>cprevious<cr>zv", { silent = true, desc = "previous qf item" })
keymap.set("n", "]q", "<cmd>cnext<cr>zv", { silent = true, desc = "next qf item" })
keymap.set("n", "[Q", "<cmd>cfirst<cr>zv", { silent = true, desc = "first qf item" })
keymap.set("n", "]Q", "<cmd>clast<cr>zv", { silent = true, desc = "last qf item" })
-- Close location list or quickfix list if they are present, see https://superuser.com/q/355325/736190
keymap.set("n", [[\x]], "<cmd>windo lclose <bar> cclose <cr>", {
silent = true,
desc = "close qf and location list",
})
-- Delete a buffer, without closing the window, see https://stackoverflow.com/q/4465095/6064933
keymap.set("n", [[\d]], "<cmd>bprevious <bar> bdelete #<cr>", {
silent = true,
desc = "delete buffer",
})
-- Insert a blank line below or above current line (do not move the cursor),
-- see https://stackoverflow.com/a/16136133/6064933
keymap.set("n", "<space>o", "printf('m`%so<ESC>``', v:count1)", {
expr = true,
desc = "insert line below",
})
keymap.set("n", "<space>O", "printf('m`%sO<ESC>``', v:count1)", {
expr = true,
desc = "insert line above",
})
-- Move the cursor based on physical lines, not the actual lines.
keymap.set("n", "j", "v:count == 0 ? 'gj' : 'j'", { expr = true })
keymap.set("n", "k", "v:count == 0 ? 'gk' : 'k'", { expr = true })
keymap.set("n", "^", "g^")
keymap.set("n", "0", "g0")
-- Do not include white space characters when using $ in visual mode,
-- see https://vi.stackexchange.com/q/12607/15292
keymap.set("x", "$", "g_")
-- Go to start or end of line easier
keymap.set({ "n", "x" }, "H", "^")
keymap.set({ "n", "x" }, "L", "g_")
-- Continuous visual shifting (does not exit Visual mode), `gv` means
-- to reselect previous visual area, see https://superuser.com/q/310417/736190
keymap.set("x", "<", "<gv")
keymap.set("x", ">", ">gv")
-- Edit and reload nvim config file quickly
keymap.set("n", "<leader>ev", "<cmd>tabnew $MYVIMRC <bar> tcd %:h<cr>", {
silent = true,
desc = "open init.lua",
})
keymap.set("n", "<leader>sv", function()
vim.cmd([[
update $MYVIMRC
source $MYVIMRC
]])
vim.notify("Nvim config successfully reloaded!", vim.log.levels.INFO, { title = "nvim-config" })
end, {
silent = true,
desc = "reload init.lua",
})
-- Reselect the text that has just been pasted, see also https://stackoverflow.com/a/4317090/6064933.
keymap.set("n", "<leader>v", "printf('`[%s`]', getregtype()[0])", {
expr = true,
desc = "reselect last pasted area",
})
-- Always use very magic mode for searching
keymap.set("n", "/", [[/\v]])
-- Search in selected region
-- xnoremap / :<C-U>call feedkeys('/\%>'.(line("'<")-1).'l\%<'.(line("'>")+1)."l")<CR>
-- Change current working directory locally and print cwd after that,
-- see https://vim.fandom.com/wiki/Set_working_directory_to_the_current_file
keymap.set("n", "<leader>cd", "<cmd>lcd %:p:h<cr><cmd>pwd<cr>", { desc = "change cwd" })
-- Use Esc to quit builtin terminal
keymap.set("t", "<Esc>", [[<c-\><c-n>]])
-- Toggle spell checking
keymap.set("n", "<F11>", "<cmd>set spell!<cr>", { desc = "toggle spell" })
keymap.set("i", "<F11>", "<c-o><cmd>set spell!<cr>", { desc = "toggle spell" })
-- Change text without putting it into the vim register,
-- see https://stackoverflow.com/q/54255/6064933
keymap.set("n", "c", '"_c')
keymap.set("n", "C", '"_C')
keymap.set("n", "cc", '"_cc')
keymap.set("x", "c", '"_c')
-- Remove trailing whitespace characters
keymap.set("n", "<leader><space>", "<cmd>StripTrailingWhitespace<cr>", { desc = "remove trailing space" })
-- check the syntax group of current cursor position
keymap.set("n", "<leader>st", "<cmd>call utils#SynGroup()<cr>", { desc = "check syntax group" })
-- Copy entire buffer.
keymap.set("n", "<leader>y", "<cmd>%yank<cr>", { desc = "yank entire buffer" })
-- Toggle cursor column
keymap.set("n", "<leader>cl", "<cmd>call utils#ToggleCursorCol()<cr>", { desc = "toggle cursor column" })
-- Move current line up and down
keymap.set("n", "<A-k>", '<cmd>call utils#SwitchLine(line("."), "up")<cr>', { desc = "move line up" })
keymap.set("n", "<A-j>", '<cmd>call utils#SwitchLine(line("."), "down")<cr>', { desc = "move line down" })
-- Move current visual-line selection up and down
keymap.set("x", "<A-k>", '<cmd>call utils#MoveSelection("up")<cr>', { desc = "move selection up" })
keymap.set("x", "<A-j>", '<cmd>call utils#MoveSelection("down")<cr>', { desc = "move selection down" })
-- Replace visual selection with text in register, but not contaminate the register,
-- see also https://stackoverflow.com/q/10723700/6064933.
keymap.set("x", "p", '"_c<Esc>p')
-- Go to a certain buffer
keymap.set("n", "gb", '<cmd>call buf_utils#GoToBuffer(v:count, "forward")<cr>', {
desc = "go to buffer (forward)",
})
keymap.set("n", "gB", '<cmd>call buf_utils#GoToBuffer(v:count, "backward")<cr>', {
desc = "go to buffer (backward)",
})
-- Switch windows
keymap.set("n", "<left>", "<c-w>h")
keymap.set("n", "<Right>", "<C-W>l")
keymap.set("n", "<Up>", "<C-W>k")
keymap.set("n", "<Down>", "<C-W>j")
-- Text objects for URL
keymap.set({ "x", "o" }, "iu", "<cmd>call text_obj#URL()<cr>", { desc = "URL text object" })
-- Text objects for entire buffer
keymap.set({ "x", "o" }, "iB", "<cmd>call text_obj#Buffer()<cr>", { desc = "buffer text object" })
-- Do not move my cursor when joining lines.
keymap.set("n", "J", function()
vim.cmd([[
normal! mzJ`z
delmarks z
]])
end, {
desc = "join line",
})
keymap.set("n", "gJ", function()
-- we must use `normal!`, otherwise it will trigger recursive mapping
vim.cmd([[
normal! zmgJ`z
delmarks z
]])
end, {
desc = "join visual lines",
})
-- Break inserted text into smaller undo units when we insert some punctuation chars.
local undo_ch = { ",", ".", "!", "?", ";", ":" }
for _, ch in ipairs(undo_ch) do
keymap.set("i", ch, ch .. "<c-g>u")
end
-- insert semicolon in the end
keymap.set("i", "<A-;>", "<Esc>miA;<Esc>`ii")
-- Keep cursor position after yanking
keymap.set("n", "y", "myy")
api.nvim_create_autocmd("TextYankPost", {
pattern = "*",
group = api.nvim_create_augroup("restore_after_yank", { clear = true }),
callback = function()
vim.cmd([[
silent! normal! `y
silent! delmarks y
]])
end,
})
-- Go to the beginning and end of current line in insert mode quickly
keymap.set("i", "<C-A>", "<HOME>")
keymap.set("i", "<C-E>", "<END>")
-- Go to beginning of command in command-line mode
keymap.set("c", "<C-A>", "<HOME>")
-- Delete the character to the right of the cursor
keymap.set("i", "<C-D>", "<DEL>")
keymap.set("n", "<leader>cb", function()
local cnt = 0
local blink_times = 7
local timer = uv.new_timer()
timer:start(0, 100, vim.schedule_wrap(function()
vim.cmd[[
set cursorcolumn!
set cursorline!
]]
if cnt == blink_times then
timer:close()
end
cnt = cnt + 1
end))
end)

View File

@@ -1,198 +0,0 @@
" Save key strokes (now we do not need to press shift to enter command mode).
" Vim-sneak has also mapped `;`, so using the below mapping will break the map
" used by vim-sneak
nnoremap ; :
xnoremap ; :
" Quicker way to open command window
nnoremap q; q:
" Turn the word under cursor to upper case
inoremap <c-u> <Esc>viwUea
" Turn the current word into title case
inoremap <c-t> <Esc>b~lea
" Paste non-linewise text above or below current cursor,
" see https://stackoverflow.com/a/1346777/6064933
nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``
" Shortcut for faster save and quit
nnoremap <silent> <leader>w :<C-U>update<CR>
" Saves the file if modified and quit
nnoremap <silent> <leader>q :<C-U>x<CR>
" Quit all opened buffers
nnoremap <silent> <leader>Q :<C-U>qa!<CR>
" Navigation in the location and quickfix list
nnoremap <silent> [l :<C-U>lprevious<CR>zv
nnoremap <silent> ]l :<C-U>lnext<CR>zv
nnoremap <silent> [L :<C-U>lfirst<CR>zv
nnoremap <silent> ]L :<C-U>llast<CR>zv
nnoremap <silent> [q :<C-U>cprevious<CR>zv
nnoremap <silent> ]q :<C-U>cnext<CR>zv
nnoremap <silent> [Q :<C-U>cfirst<CR>zv
nnoremap <silent> ]Q :<C-U>clast<CR>zv
" Close location list or quickfix list if they are present,
" see https://superuser.com/q/355325/736190
nnoremap<silent> \x :<C-U>windo lclose <bar> cclose<CR>
" Close a buffer and switching to another buffer, do not close the
" window, see https://stackoverflow.com/q/4465095/6064933
nnoremap <silent> \d :<C-U>bprevious <bar> bdelete #<CR>
" Insert a blank line below or above current line (do not move the cursor),
" see https://stackoverflow.com/a/16136133/6064933
nnoremap oo :echo 'Please use <lt>space>o instead'<CR>
nnoremap OO :echo 'Please use <lt>space>O instead'<CR>
nnoremap <expr> <Space>o printf('m`%so<ESC>``', v:count1)
nnoremap <expr> <Space>O printf('m`%sO<ESC>``', v:count1)
" Insert a space after current character
nnoremap <Space><Space> a<Space><ESC>h
" Yank from current cursor position to the end of the line (make it
" consistent with the behavior of D, C)
nnoremap Y y$
" Move the cursor based on physical lines, not the actual lines.
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap ^ g^
nnoremap 0 g0
" Do not include white space characters when using $ in visual mode,
" see https://vi.stackexchange.com/q/12607/15292
xnoremap $ g_
" Jump to matching pairs easily in normal mode
nnoremap <Tab> %
" Go to start or end of line easier
nnoremap H ^
xnoremap H ^
nnoremap L g_
xnoremap L g_
" Continuous visual shifting (does not exit Visual mode), `gv` means
" to reselect previous visual area, see https://superuser.com/q/310417/736190
xnoremap < <gv
xnoremap > >gv
" When completion menu is shown, use <cr> to select an item and do not add an
" annoying newline. Otherwise, <enter> is what it is. For more info , see
" https://superuser.com/a/941082/736190 and
" https://unix.stackexchange.com/q/162528/221410
" inoremap <expr> <cr> ((pumvisible())?("\<C-Y>"):("\<cr>"))
" Use <esc> to close auto-completion menu
" inoremap <expr> <esc> ((pumvisible())?("\<C-e>"):("\<esc>"))
" Tab-complete, see https://vi.stackexchange.com/q/19675/15292.
inoremap <expr> <tab> pumvisible() ? "\<c-n>" : "\<tab>"
inoremap <expr> <s-tab> pumvisible() ? "\<c-p>" : "\<s-tab>"
" Edit and reload init.vim quickly
nnoremap <silent> <leader>ev :<C-U>tabnew $MYVIMRC <bar> tcd %:h<cr>
nnoremap <silent> <leader>sv :<C-U>silent update $MYVIMRC <bar> source $MYVIMRC <bar>
\ call v:lua.vim.notify("Nvim config successfully reloaded!", 'info', {'title': 'nvim-config'})<cr>
" Reselect the text that has just been pasted, see also https://stackoverflow.com/a/4317090/6064933.
nnoremap <expr> <leader>v printf('`[%s`]', getregtype()[0])
" Search in selected region
xnoremap / :<C-U>call feedkeys('/\%>'.(line("'<")-1).'l\%<'.(line("'>")+1)."l")<CR>
" Find and replace (like Sublime Text 3)
nnoremap <C-H> :%s/
xnoremap <C-H> :s/
" Change current working directory locally and print cwd after that,
" see https://vim.fandom.com/wiki/Set_working_directory_to_the_current_file
nnoremap <silent> <leader>cd :<C-U>lcd %:p:h<CR>:pwd<CR>
" Use Esc to quit builtin terminal
tnoremap <ESC> <C-\><C-n>
" Toggle spell checking (autosave does not play well with z=, so we disable it
" when we are doing spell checking)
nnoremap <silent> <F11> :<C-U>set spell!<cr>
inoremap <silent> <F11> <C-O>:<C-U>set spell!<cr>
" Change text without putting it into the vim register,
" see https://stackoverflow.com/q/54255/6064933
nnoremap c "_c
nnoremap C "_C
nnoremap cc "_cc
xnoremap c "_c
" Remove trailing whitespace characters
nnoremap <silent> <leader><Space> :<C-U>StripTrailingWhitespace<CR>
" check the syntax group of current cursor position
nnoremap <silent> <leader>st :<C-U>call utils#SynGroup()<CR>
" Clear highlighting
if maparg('<C-L>', 'n') ==# ''
nnoremap <silent> <C-L> :<C-U>nohlsearch<C-R>=has('diff')?'<Bar>diffupdate':''<CR><CR><C-L>
endif
" Copy entire buffer.
nnoremap <silent> <leader>y :<C-U>%y<CR>
" Toggle cursor column
nnoremap <silent> <leader>cl :<C-U>call utils#ToggleCursorCol()<CR>
" Move current line up and down
nnoremap <silent> <A-k> <Cmd>call utils#SwitchLine(line('.'), 'up')<CR>
nnoremap <silent> <A-j> <Cmd>call utils#SwitchLine(line('.'), 'down')<CR>
" Move current visual-line selection up and down
xnoremap <silent> <A-k> :<C-U>call utils#MoveSelection('up')<CR>
xnoremap <silent> <A-j> :<C-U>call utils#MoveSelection('down')<CR>
" Replace visual selection with text in register, but not contaminate the
" register, see also https://stackoverflow.com/q/10723700/6064933.
xnoremap p "_c<ESC>p
nnoremap <silent> gb :<C-U>call buf_utils#GoToBuffer(v:count, 'forward')<CR>
nnoremap <silent> gB :<C-U>call buf_utils#GoToBuffer(v:count, 'backward')<CR>
nnoremap <Left> <C-W>h
nnoremap <Right> <C-W>l
nnoremap <Up> <C-W>k
nnoremap <Down> <C-W>j
" Text objects for URL
xnoremap <silent> iu :<C-U>call text_obj#URL()<CR>
onoremap <silent> iu :<C-U>call text_obj#URL()<CR>
" Text objects for entire buffer
xnoremap <silent> iB :<C-U>call text_obj#Buffer()<CR>
onoremap <silent> iB :<C-U>call text_obj#Buffer()<CR>
" Do not move my cursor when joining lines.
nnoremap J mzJ`z
" Break inserted text into smaller undo units.
for ch in [',', '.', '!', '?', ';', ':']
execute printf('inoremap %s %s<C-g>u', ch, ch)
endfor
" insert semicolon in the end
inoremap <A-;> <ESC>miA;<ESC>`ii
" Keep cursor position after yanking
nnoremap y myy
xnoremap y myy
augroup restore_after_yank
autocmd!
autocmd TextYankPost * call s:restore_cursor()
augroup END
function! s:restore_cursor() abort
silent! normal `y
silent! delmarks y
endfunction

View File

@@ -35,10 +35,7 @@ set wildignore+=*.aux,*.bbl,*.blg,*.brf,*.fls,*.fdb_latexmk,*.synctex.gz,*.xdv
set wildignorecase " ignore file and dir name cases in cmd-completion
" Set up backup directory
let g:backupdir=expand(stdpath('data') . '/backup')
if !isdirectory(g:backupdir)
call mkdir(g:backupdir, 'p')
endif
let g:backupdir=expand(stdpath('data') . '/backup//')
let &backupdir=g:backupdir
" Skip backup for patterns in option wildignore
@@ -47,9 +44,9 @@ set backup " create backup for files
set backupcopy=yes " copy the original file to backupdir and overwrite it
" General tab settings
set tabstop=4 " number of visual spaces per TAB
set softtabstop=4 " number of spaces in tab when editing
set shiftwidth=4 " number of spaces to use for autoindent
set tabstop=2 " number of visual spaces per TAB
set softtabstop=2 " number of spaces in tab when editing
set shiftwidth=2 " number of spaces to use for autoindent
set expandtab " expand tab to spaces so that tabs are spaces
" Set matching pairs of characters and highlight matching brackets
@@ -78,14 +75,13 @@ set scrolloff=3
" Use mouse to select and resize windows, etc.
set mouse=nic " Enable mouse in several mode
set mousemodel=popup " Set the behaviour of mouse
set mousescroll=ver:1,hor:6
" Do not show mode on command line since vim-airline can show it
" Disable showing current mode on command line since statusline plugins can show it.
set noshowmode
set fileformats=unix,dos " Fileformats to use for new files
set inccommand=nosplit " Show the result of substitution in real time for preview
" Ask for confirmation when handling unsaved or read-only files
set confirm
@@ -117,6 +113,9 @@ set shortmess+=c
" choice, IMHO.
set shortmess+=S
" Disable showing intro message (:intro)
set shortmess+=I
" Completion behaviour
" set completeopt+=noinsert " Auto select the first completion entry
set completeopt+=menuone " Show menu even if there is only one item
@@ -125,7 +124,7 @@ set completeopt-=preview " Disable the preview window
set pumheight=10 " Maximum number of items to show in popup menu
set pumblend=10 " pseudo transparency for completion menu
set winblend=5 " pseudo transparency for floating window
set winblend=0 " pseudo transparency for floating window
" Insert mode key word completion setting
set complete+=kspell complete-=w complete-=b complete-=u complete-=t
@@ -146,11 +145,7 @@ set formatoptions+=mM
" Tilde (~) is an operator, thus must be followed by motions like `e` or `w`.
set tildeop
" Do not add two spaces after a period when joining lines or formatting texts,
" see https://stackoverflow.com/q/4760428/6064933
set nojoinspaces
set synmaxcol=200 " Text after this column number is not highlighted
set synmaxcol=250 " Text after this column number is not highlighted
set nostartofline
" External program to use for grep command
@@ -168,7 +163,7 @@ set termguicolors
" https://github.com/neovim/neovim/wiki/FAQ#how-to-change-cursor-color-in-the-terminal
set guicursor=n-v-c:block-Cursor/lCursor,i-ci-ve:ver25-Cursor2/lCursor2,r-cr:hor20,o:hor20
set signcolumn=auto:2
set signcolumn=yes:1
" Remove certain character from file name pattern matching
set isfname-==
@@ -181,3 +176,6 @@ set diffopt+=filler " show filler for deleted lines
set diffopt+=closeoff " turn off diff when one file window is closed
set diffopt+=context:3 " context for diff
set diffopt+=internal,indent-heuristic,algorithm:histogram
set nowrap " do no wrap
set noruler

View File

@@ -1,7 +1,7 @@
scriptencoding utf-8
" Plugin specification and lua stuff
lua require('lua-init')
lua require('plugins')
" Use short names for common plugin manager commands to simplify typing.
" To use these shortcuts: first activate command line with `:`, then input the
@@ -12,6 +12,10 @@ call utils#Cabbrev('pud', 'PackerUpdate')
call utils#Cabbrev('pc', 'PackerClean')
call utils#Cabbrev('ps', 'PackerSync')
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" configurations for vim script plugin "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""UltiSnips settings"""""""""""""""""""
" Trigger configuration. Do not use <tab> if you use YouCompleteMe
let g:UltiSnipsExpandTrigger='<c-j>'
@@ -27,25 +31,9 @@ let g:UltiSnipsJumpBackwardTrigger='<c-k>'
" https://jdhao.github.io/2019/04/17/neovim_snippet_s1/ for details.
let g:UltiSnipsSnippetDirectories=['UltiSnips', 'my_snippets']
"""""""""""""""""""""""""" semshi settings """""""""""""""""""""""""""""""
" Do not highlight for all occurrences of variable under cursor
let g:semshi#mark_selected_nodes=0
" Do not show error sign since linting plugin is specialized for that
let g:semshi#error_sign=v:false
"""""""""""""""""""""""""" vlime settings """"""""""""""""""""""""""""""""
command! -nargs=0 StartVlime call jobstart(printf("sbcl --load %s/vlime/lisp/start-vlime.lisp", g:package_home))
""""""""""""""""""""""""""""" settings for nvim-hlslens"""""""""""""""
noremap <silent> n <Cmd>execute('normal! ' . v:count1 . 'nzzzv')<CR>
\<Cmd>lua require('hlslens').start()<CR>
noremap <silent> N <Cmd>execute('normal! ' . v:count1 . 'Nzzzv')<CR>
\<Cmd>lua require('hlslens').start()<CR>
map * <Plug>(asterisk-z*)<Cmd>lua require('hlslens').start()<CR>
map # <Plug>(asterisk-z#)<Cmd>lua require('hlslens').start()<CR>
"""""""""""""""""""""""""""""LeaderF settings"""""""""""""""""""""
" Do not use cache file
let g:Lf_UseCache = 0
@@ -68,7 +56,7 @@ if g:is_linux
endif
" Only fuzzy-search files names
let g:Lf_DefaultMode = 'NameOnly'
let g:Lf_DefaultMode = 'FullPath'
" Popup window settings
let w = float2nr(&columns * 0.8)
@@ -84,6 +72,12 @@ let g:Lf_PopupPosition = [0, float2nr((&columns - g:Lf_PopupWidth)/2)]
" submodules are not searched by default.
let g:Lf_UseVersionControlTool = 0
" Use rg as the default search tool
let g:Lf_DefaultExternalTool = "rg"
" show dot files
let g:Lf_ShowHidden = 1
" Disable default mapping
let g:Lf_ShortcutF = ''
let g:Lf_ShortcutB = ''
@@ -95,21 +89,19 @@ let g:Lf_WorkingDirectoryMode = 'a'
nnoremap <silent> <leader>ff :<C-U>Leaderf file --popup<CR>
" Grep project files in popup window
nnoremap <silent> <leader>fg :<C-U>Leaderf rg --popup<CR>
nnoremap <silent> <leader>fg :<C-U>Leaderf rg --no-messages --popup<CR>
" Search vim help files
nnoremap <silent> <leader>fh :<C-U>Leaderf help --popup<CR>
nnoremap <silent> <leader>h :<C-U>echoerr "Use \<lt>leader>fh instead!"<CR>
" Search tags in current buffer
nnoremap <silent> <leader>ft :<C-U>Leaderf bufTag --popup<CR>
nnoremap <silent> <leader>t :<C-U>echoerr "Use \<lt>leader>ft instead!"<CR>
" Switch buffers
nnoremap <silent> <leader>fb :<C-U>Leaderf buffer --popup<CR>
" Search recent files
nnoremap <silent> <leader>fr :<C-U>Leaderf mru --popup<CR>
nnoremap <silent> <leader>fr :<C-U>Leaderf mru --popup --absolute-path<CR>
let g:Lf_PopupColorscheme = 'gruvbox_material'
@@ -127,14 +119,6 @@ if g:is_win || g:is_mac
xmap ob <Plug>(openbrowser-smart-search)
endif
""""""""""""""""""""""""""" gutentags settings """"""""""""""""""""""""""""""
" The path to store tags files, instead of in the project root.
let g:gutentags_cache_dir = stdpath('cache') . '/ctags'
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+px']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']
let g:gutentags_ctags_exclude = ['*.md', '*.html', '*.json', '*.toml', '*.css', '*.js',]
""""""""""""""""""""""""""" vista settings """"""""""""""""""""""""""""""""""
let g:vista#renderer#icons = {
\ 'member': '',
@@ -198,22 +182,7 @@ let g:neoformat_c_clangformat = {
let g:neoformat_enabled_cpp = ['clangformat']
let g:neoformat_enabled_c = ['clangformat']
"""""""""""""""""""""""""vim-signify settings""""""""""""""""""""""""""""""
" The VCS to use
let g:signify_vcs_list = [ 'git' ]
" Change the sign for certain operations
let g:signify_sign_change = '~'
"""""""""""""""""""""""""vim-fugitive settings""""""""""""""""""""""""""""""
nnoremap <silent> <leader>gs :Git<CR>
nnoremap <silent> <leader>gw :Gwrite<CR>
nnoremap <silent> <leader>gc :Git commit<CR>
nnoremap <silent> <leader>gpl :Git pull<CR>
" Note that to use bar literally, we need backslash it, see also `:h :bar`.
nnoremap <silent> <leader>gpu :15split \| term git push
"""""""""""""""""""""""""plasticboy/vim-markdown settings"""""""""""""""""""
"""""""""""""""""""""""""vim-markdown settings"""""""""""""""""""
" Disable header folding
let g:vim_markdown_folding_disabled = 1
@@ -274,8 +243,8 @@ nmap s <Nop>
omap s <Nop>
""""""""""""""""""""""""""""vimtex settings"""""""""""""""""""""""""""""
if ( g:is_win || g:is_mac ) && executable('latex')
" Hacks for inverse serach to work semi-automatically,
if executable('latex')
" Hacks for inverse search to work semi-automatically,
" see https://jdhao.github.io/2021/02/20/inverse_search_setup_neovim_vimtex/.
function! s:write_server_name() abort
let nvim_server_file = (has('win32') ? $TEMP : '/tmp') . '/vimtexserver.txt'
@@ -307,7 +276,6 @@ if ( g:is_win || g:is_mac ) && executable('latex')
" Viewer settings for different platforms
if g:is_win
let g:vimtex_view_general_viewer = 'SumatraPDF'
let g:vimtex_view_general_options_latexmk = '-reuse-instance'
let g:vimtex_view_general_options = '-reuse-instance -forward-search @tex @line @pdf'
endif
@@ -336,63 +304,6 @@ if ( g:is_win || g:is_mac ) && executable('latex')
endif
endif
"""""""""""""""""""""""""""vim-airline setting""""""""""""""""""""""""""""""
" Set airline theme to a random one if it exists
let s:candidate_airlinetheme = ['ayu_mirage', 'lucius', 'ayu_dark', 'base16_bright',
\ 'base16_adwaita', 'raven', 'term', 'deus', 'onedark']
let g:airline_theme = utils#RandElement(s:candidate_airlinetheme)
" Whether to show function or other tags on status line
let g:airline#extensions#vista#enabled = 0
let g:airline#extensions#gutentags#enabled = 1
" Do not show search index in statusline since it is shown on command line
let g:airline#extensions#anzu#enabled = 0
" Enable vim-airline extension for nvim-lsp
let g:airline#extensions#nvimlsp#enabled = 1
let g:airline#extensions#searchcount#enabled = 0
" Skip empty sections if there are nothing to show,
" extracted from https://vi.stackexchange.com/a/9637/15292
let g:airline_skip_empty_sections = 1
" Whether to use powerline symbols, see https://vi.stackexchange.com/q/3359/15292
let g:airline_powerline_fonts = 0
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_symbols.paste = 'ρ'
let g:airline_symbols.linenr = " L:"
let g:airline_symbols.colnr = " C:"
if !g:is_linux
let g:airline_symbols.branch = ''
let g:airline_symbols.spell = 'Ꞩ'
endif
" Custom branch name
let g:airline#extensions#branch#custom_head = 'utils#GetGitBranch'
" Only show git hunks which are non-zero
let g:airline#extensions#hunks#non_zero_only = 1
" Speed up airline
let g:airline_highlighting_cache = 1
" The keys in the following shortcode are the layout when we use a specific
" input method mode. On my macOS, 0 means that we are trying to input Chinese,
" and 1 means we are using English mode.
" See also https://github.com/vim-airline/vim-airline/blob/master/autoload/airline/extensions/xkblayout.vim#L11
let g:airline#extensions#xkblayout#short_codes = {'0': 'CN', '1': 'US'}
""""""""""""""""""""""""""""vim-startify settings""""""""""""""""""""""""""""
" Do not change working directory when opening files.
let g:startify_change_to_dir = 0
let g:startify_fortune_use_unicode = 1
""""""""""""""""""""""""""""vim-matchup settings"""""""""""""""""""""""""""""
" Improve performance
let g:matchup_matchparen_deferred = 1
@@ -439,9 +350,20 @@ if exists('g:started_by_firenvim') && g:started_by_firenvim
\ }
\ }
function s:setup_firenvim() abort
set signcolumn=no
set noruler
set noshowcmd
set laststatus=0
set showtabline=0
endfunction
augroup firenvim
autocmd!
autocmd BufEnter *.txt setlocal filetype=markdown laststatus=0 nonumber noshowcmd noruler showtabline=1
autocmd BufEnter * call s:setup_firenvim()
autocmd BufEnter sqlzoo*.txt set filetype=sql
autocmd BufEnter github.com_*.txt set filetype=markdown
autocmd BufEnter stackoverflow.com_*.txt set filetype=markdown
augroup END
endif
@@ -449,21 +371,17 @@ endif
nnoremap <leader>dp :<C-U>GdbStartPDB python -m pdb %<CR>
""""""""""""""""""""""""""""""wilder.nvim settings""""""""""""""""""""""""""""""
augroup wilder_init
autocmd!
" CursorHold is suggested here: https: //github.com/gelguy/wilder.nvim/issues/89#issuecomment-934465957.
autocmd CursorHold * ++once call s:wilder_init()
augroup END
call timer_start(250, { -> s:wilder_init() })
function! s:wilder_init() abort
try
call wilder#enable_cmdline_enter()
set wildcharm=<Tab>
cmap <expr> <Tab> wilder#in_context() ? wilder#next() : "\<Tab>"
cmap <expr> <S-Tab> wilder#in_context() ? wilder#previous() : "\<S-Tab>"
" only / and ? are enabled by default
call wilder#set_option('modes', ['/', '?', ':'])
call wilder#setup({
\ 'modes': [':', '/', '?'],
\ 'next_key': '<Tab>',
\ 'previous_key': '<S-Tab>',
\ 'accept_key': '<C-y>',
\ 'reject_key': '<C-e>'
\ })
call wilder#set_option('pipeline', [
\ wilder#branch(
@@ -485,14 +403,18 @@ function! s:wilder_init() abort
let l:hl = wilder#make_hl('WilderAccent', 'Pmenu', [{}, {}, {'foreground': '#f4468f'}])
call wilder#set_option('renderer', wilder#popupmenu_renderer({
\ 'highlighter': wilder#basic_highlighter(),
\ 'winblend': 5,
\ 'max_height': 15,
\ 'highlights': {
\ 'accent': l:hl,
\ },
\ 'left': [' ', wilder#popupmenu_devicons(),],
\ 'right': [' ', wilder#popupmenu_scrollbar(),],
\ 'apply_incsearch_fix': 0,
\ }))
catch /^Vim\%((\a\+)\)\=:E117/
echohl Error |echomsg "Wilder.nvim missing. Run :PackerInstall to install all plugins."|echohl None
echohl Error |echomsg "Wilder.nvim missing: run :PackerSync to fix."|echohl None
endtry
endfunction
""""""""""""""""""""""""""""""vim-auto-save settings""""""""""""""""""""""""""""""
let g:auto_save = 1 " enable AutoSave on Vim startup

View File

@@ -1,94 +0,0 @@
let s:my_theme_dict = {}
function! s:my_theme_dict.gruvbox8() dict abort
packadd! vim-gruvbox8
" Italic options should be put before colorscheme setting,
" see https://github.com/morhetz/gruvbox/wiki/Terminal-specific#1-italics-is-disabled
let g:gruvbox_italics=1
let g:gruvbox_italicize_strings=1
let g:gruvbox_filetype_hi_groups = 1
let g:gruvbox_plugin_hi_groups = 1
colorscheme gruvbox8_hard
endfunction
function! s:my_theme_dict.onedark() dict abort
packadd! onedark.nvim
colorscheme onedark
endfunction
function! s:my_theme_dict.edge() dict abort
packadd! edge
let g:edge_enable_italic = 1
let g:edge_better_performance = 1
colorscheme edge
endfunction
function! s:my_theme_dict.sonokai() dict abort
packadd! sonokai
let g:sonokai_enable_italic = 1
let g:sonokai_better_performance = 1
colorscheme sonokai
endfunction
function! s:my_theme_dict.gruvbox_material() dict abort
packadd! gruvbox-material
let g:gruvbox_material_enable_italic = 1
let g:gruvbox_material_better_performance = 1
colorscheme gruvbox-material
endfunction
function! s:my_theme_dict.nord() dict abort
packadd! nord.nvim
colorscheme nord
endfunction
function! s:my_theme_dict.doom_one() dict abort
packadd! doom-one.nvim
colorscheme doom-one
endfunction
function! s:my_theme_dict.everforest() dict abort
packadd! everforest
let g:everforest_enable_italic = 1
let g:everforest_better_performance = 1
colorscheme everforest
endfunction
function! s:my_theme_dict.nightfox() dict abort
packadd! nightfox.nvim
colorscheme nordfox
endfunction
let s:candidate_theme = [
\ 'gruvbox8',
\ 'onedark',
\ 'edge',
\ 'sonokai',
\ 'gruvbox_material',
\ 'nord',
\ 'doom_one',
\ 'everforest',
\ 'nightfox'
\ ]
let s:theme = utils#RandElement(s:candidate_theme)
let s:colorscheme_func = printf('s:my_theme_dict.%s()', s:theme)
if has_key(s:my_theme_dict, s:theme)
execute 'call ' . s:colorscheme_func
if g:logging_level == 'debug'
let s:msg1 = "Currently loaded theme: " . s:theme
call v:lua.vim.notify(s:msg1, 'info', {'title': 'nvim-config'})
endif
else
let s:msg = "Invalid colorscheme function: " . s:colorscheme_func
call v:lua.vim.notify(s:msg, 'error', {'title': 'nvim-config'})
endif

View File

@@ -1,37 +1,81 @@
This doc summarizes how to install and use this configuration in detail.
# Pre-requisite
There are a few dependencies if we want to use Nvim for efficient editing and
development work.
## Terminal emulators
## Python
Which [terminal emulator](https://en.wikipedia.org/wiki/Terminal_emulator) we choose to use greatly affects the appearance and features of Nvim.
Since Nvim supports true colors, terminals that support true colors are preferred.
For a list of terminals that support true colors, see [here](https://github.com/termstandard/colors).
A lot of Nvim plugins are mainly written in Python. To use auto-completion and
other features, we must install Python 3. The easiest way to install is via
[Anaconda](https://www.anaconda.com/distribution/#download-section) or [Miniconda](https://docs.conda.io/en/latest/miniconda.html). Make sure that
you can run `python --version`, and that the output should be Python 3.x.
For macOS, we can use [kitty](https://sw.kovidgoyal.net/kitty/), [iterm2](https://www.iterm2.com/), [wezterm](https://wezfurlong.org/wezterm/) or [Alacritty](https://github.com/jwilm/alacritty).
## Pynvim
If you ssh to Linux server on Windows, I recommend [wsltty](https://github.com/mintty/wsltty) and [Cygwin](https://www.cygwin.com/),
both of them use [mintty](https://github.com/mintty/mintty) as the terminal emulator.
For the latest version of Windows 10, you can also try [Windows Terminal](https://github.com/microsoft/terminal).
Nvim relies on [pynvim](https://github.com/neovim/pynvim) to communicate with
plugins that utilize its Python binding. Pynvim is required by plugins such as
[Semshi](https://github.com/numirias/semshi).
## Patched Fonts
Since statusline or file explorer plugins often use Unicode symbols not available in normal font,
we need to install a patched font from the [nerd-fonts](https://github.com/ryanoasis/nerd-fonts) project.
# Automatic installation
## Automatic Installation for Linux
To set up a workable Nvim environment on Linux,
I use [a bash script](nvim_setup_linux.sh) to automatically install necessary dependencies, Nvim itself and configs.
Note that the variable `PYTHON_INSTALLED`, `SYSTEM_PYTHON` and `ADD_TO_SYSTEM_PATH` in the script
should be set properly based on your environment.
## Automatic installation for Windows
Run the script [nvim_setup_windows.ps1](nvim_setup_windows.ps1) in PowerShell **with Administrator rights**:
```
.\docs\nvim_setup_windows.ps1
```
# Manual install
There are a few dependencies if we want to use Nvim for efficient editing and development work.
## Dependencies
### Python
A lot of Nvim plugins are mainly written in Python, so we must install Python 3.
The easiest way to install is via [Anaconda](https://docs.anaconda.com/anaconda/install/index.html) or [Miniconda](https://docs.conda.io/en/latest/miniconda.html).
After installation, make sure that you can run `python --version`,
and that the output should be Python 3.x.
### Pynvim
Nvim relies on [pynvim](https://github.com/neovim/pynvim) to communicate with plugins that utilize its Python binding.
Pynvim is required by plugins such as [wilder.nvim](https://github.com/gelguy/wilder.nvim).
```
pip install -U pynvim
```
## python-lsp-server
### python-lsp-server
[python-lsp-server](https://github.com/python-lsp/python-lsp-server) is the community-fork of [pyls](https://github.com/palantir/python-language-server), and it is a Python Language Server for completion,
linting, go to definition, etc.
[python-lsp-server (pylsp)](https://github.com/python-lsp/python-lsp-server) is a Python [Language Server](https://microsoft.github.io/language-server-protocol/) for completion, linting, go to definition, etc.
```
pip install 'python-lsp-server[all]' pylsp-mypy pyls-isort
```
## Node
Note the executable for pylsp is also named `pylsp`. You need to set its PATH correctly.
If you use pip from Anaconda, the executable path may be something like `$CONDA_ROOT/bin/pylsp`.
For native python, the path for pylsp may be like `$HOME/.local/bin/pylsp`
We need to install node.js from [here](https://nodejs.org/en/download/):
### Node
We need to install node.js from [here](https://nodejs.org/en/download/).
For Linux, you can use the following script:
```bash
# Ref: https://johnpapa.net/node-and-npm-without-sudo/
@@ -55,32 +99,31 @@ source ~/.bash_profile
# source ~/.zshrc
```
## vim-language-server
### vim-language-server
[vim-language-server](https://github.com/iamcco/vim-language-server) provides
completion for vim script. We can install vim-language-server globally and set
its path:
[vim-language-server](https://github.com/iamcco/vim-language-server) provides completion for vim script. We can install vim-language-server globally:
```bash
npm install -g vim-language-server
export PATH="$HOME/.npm-packages/bin:$PATH"
```
## Git
vim-language-server is installed in the same directory as the node executable.
Git is used by the plugin manager [packer.nvim](https://github.com/wbthomason/packer.nvim) to clone plugins from GitHub or
other Git repositories.
### Git
Since Git is usually pre-installed on Linux and macOS, we do not need to worry
if we are on these two platforms. For Windows, install [Git for Windows](https://git-scm.com/download/win)
and make sure you can call `git` from the command line.
Git is required by plugin manager [packer.nvim](https://github.com/wbthomason/packer.nvim) and other git-related plugins.
## ctags
For Linux and macOS, Git is usually pre-installed.
The version of Git on the Linux system may be too old so that plugins may break.
Check [here](https://jdhao.github.io/2021/03/27/upgrade_git_on_linux/) on how to install and set up the latest version of Git.
For Windows, install [Git for Windows](https://git-scm.com/download/win) and make sure you can run `git` from command line.
In order to use tags related plugins such as [vista.vim](https://github.com/liuchengxu/vista.vim) and [gutentags](https://github.com/ludovicchabant/vim-gutentags), we need to
install a ctags distribution. Universal-ctags is preferred.
### ctags
In order to use tags related plugins such as [vista.vim](https://github.com/liuchengxu/vista.vim), we need to install a ctags distribution.
Universal-ctags is preferred.
To install it on Linux, we need to build it from source. See [here](https://askubuntu.com/a/836521/768311) for the details.
To install ctags on macOS, use [Homebrew](https://github.com/universal-ctags/homebrew-universal-ctags):
```bash
@@ -93,135 +136,99 @@ To install it Windows, use [chocolatey](https://chocolatey.org/) or [scoop](http
choco install universal-ctags
# scoop bucket add extras
# scoop install univeral-ctags
# scoop install universal-ctags
```
To install it on Linux, we need to build it from source. See [here](https://askubuntu.com/a/836521/768311)
for the details.
Set its PATH properly and make sure you can run `ctags` from command line.
Set its PATH properly and make sure you can call `ctags` from command line.
### Ripgrep
## Ripgrep
[Ripgrep](https://github.com/BurntSushi/ripgrep), aka, `rg`, is a fast grepping tool available for both Linux, Windows and macOS.
It is used by several searching plugins.
[Ripgrep](https://github.com/BurntSushi/ripgrep), aka, `rg`, is a fast grepping
tool available for both Linux, Windows and macOS. It is used by several
searching plugins.
For Windows and macOS, we can install it via chocolatey and homebrew respectively.
For Linux, we can download the [binary release](https://github.com/BurntSushi/ripgrep/releases) and install it.
For Windows and macOS, we can install it via chocolatey and homebrew
respectively. For Linux, we can download the executable file from its [release
page](https://github.com/BurntSushi/ripgrep/releases) and install it.
Set its PATH properly and make sure you can run `rg` from command line.
## Linters
### Linters
A linter is a tool to check the source code for possible style and syntax
issues. Based on the programming languages we use, we may need to install
various linters.
A linter is a tool to check the source code for possible style and syntax issues.
Based on the programming languages we use, we may need to install various linters.
+ Python: [pylint](https://github.com/PyCQA/pylint) and [flake8](https://github.com/PyCQA/flake8).
+ Vim script: [vint](https://github.com/Kuniwak/vint).
## Terminal emulators
Set their PATH properly and make sure you can run `pylint`, `flake8` and `vint` from command line.
Which [terminal emulator](https://en.wikipedia.org/wiki/Terminal_emulator) we
choose to use greatly affects the appearance and functionalities of Nvim.
Since Nvim supports true colors, terminals that support true colors are
preferred. For a list of terminals that support true colors, see [here](https://github.com/termstandard/colors).
## Install Nvim
For macOS, we can use [kitty](https://sw.kovidgoyal.net/kitty/), [iterm2](https://www.iterm2.com/), or [Alacritty](https://github.com/jwilm/alacritty).
If you connect to Linux server on Windows, I recommend [wsltty](https://github.com/mintty/wsltty) and
[Cygwin](https://www.cygwin.com/), both of them use [mintty](https://github.com/mintty/mintty) as the terminal emulator.
There are various ways to install Nvim depending on your system.
This config is only maintained for [the latest nvim stable release](https://github.com/neovim/neovim/releases/tag/stable).
For the latest version of Windows 10, you can also try the new [Windows
Terminal](https://github.com/microsoft/terminal).
### Linux
## Font
You can directly download the binary release from [here](https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz).
You can also use the system package manager to install nvim,
but that is not reliable since the latest version may not be available.
Since [Vim-airline](https://github.com/vim-airline/vim-airline) uses several
Unicode symbols not available in normal font, we need to install [fonts
here](https://github.com/powerline/fonts) to make vim-airline look pretty. I am using [Hack](https://github.com/powerline/fonts/tree/master/Hack), and it looks
great. Another great resource for programming font is the [nerd-font](https://github.com/ryanoasis/nerd-fonts) project.
### Windows
# Install Nvim
You may download from [nvim release](https://github.com/neovim/neovim/releases/download/stable/nvim-win64.zip) from GitHub and manually extract it.
There are various ways to install Nvim depending on your system. Current
configuration is tested against nvim 0.5.
## Linux
We can directly download the binary release from [here](https://github.com/neovim/neovim/releases/download/v0.5.1/nvim-linux64.tar.gz).
## Windows
The easiest way to install Nvim on Windows is via chocolatey:
Another way to install Nvim on Windows is via chocolatey or scoop:
```
choco install neovim
# via scoop
# scoop bucket add versions
# scoop install neovim
```
You may download from [nvim release](https://github.com/neovim/neovim/releases/download/v0.5.1/nvim-win64.zip) from GitHub and manually extract it.
### macOS
## macOS
It is recommended to install neovim via [Homebrew](https://brew.sh/) on macOS.
Simply run the following command:
It is recommended to install neovim via [Homebrew](https://brew.sh/) on macOS. Simply run the following command:
```bash
brew install neovim
```
After installing Nvim, we need to add the directory where the Nvim executable
(`nvim` on Linux and macOS, `nvim.exe` on Windows) resides to the system `PATH`.
After installing Nvim, we need to set the path to nvim correctly.
**Make sure that you can run `nvim` from the command line after all these setups**.
Make sure that you can call `nvim` from the command line after all these
setups.
## Setting up Nvim
# Setting up Nvim
After installing nvim and all the dependencies, we will install plugin managers and set up this config.
## Install plugin manager packer.nvim
### Install plugin manager packer.nvim
I use packer.nvim to manage my plugins. We need to install packer.nvim on our
system first.
I use packer.nvim to manage my plugins. We need to install packer.nvim on our system first.
For Windows, if curl is installed, use the following command (on PowerShell):
For Windows, if curl is installed, run the following command (on PowerShell):
```
git clone --depth=1 https://github.com/wbthomason/packer.nvim "$env:LOCALAPPDATA\nvim-data\site\pack\packer\opt\packer.nvim"
```
For macOS and Linux, use the following command:
For macOS and Linux, run the following command:
```bash
git clone --depth=1 https://github.com/wbthomason/packer.nvim ~/.local/share/nvim/site/pack/packer/opt/packer.nvim
```
## How to install this configuration
### How to install this configuration
On Windows, the config directory is `$HOME/AppData/Local/nvim`[^1]. On Linux
and macOS, the directory is `~/.config/nvim`. First, we need to remove all the
files under the config directory (including dot files), then go to this
directory, and run the following command to install this configuration:
On Linux and macOS, the directory is `~/.config/nvim`.
On Windows, the config directory is `$HOME/AppData/Local/nvim`[^1].
First, we need to remove all the files under the config directory (including dot files),
then go to this directory, and run the following command:
```
git clone --depth=1 https://github.com/jdhao/nvim-config.git .
```
After that, when we first open nvim, run command `:PackerInstall` to install
all the plugins. Since I use quite a lot of plugins (more than 60), it may take
some time to install all of them, depending on your network condition.
# Automatic installation
## Automatic Installation for Linux #
To set up a workable Nvim environment on Linux, I use [this bash script](nvim_setup_linux.sh) to automatically install necessary
dependencies, Nvim itself and Nvim configs in this repo.
Note that the variable `PYTHON_INSTALLED`, `SYSTEM_PYTHON` and
`ADD_TO_SYSTEM_PATH` in the script should be set properly based on your
environment.
## Automatic installation for Windows
Run script [nvim_setup_windows.ps1](nvim_setup_windows.ps1) under PowerShell.
After that, when we first open nvim, run command `:PackerSync` to install all the plugins.
Since I use quite a lot of plugins (more than 60), it may take some time to install all of them.
[^1]: Use `echo %userprofile%` to see where your `$HOME` is.

View File

@@ -2,15 +2,16 @@
#!/bin/bash
set -eux
wget https://hub.fastgit.org/neovim/neovim/releases/download/nightly/nvim-macos.tar.gz
wget https://github.com/neovim/neovim/releases/download/stable/nvim-macos.tar.gz
if [[ ! -d "$HOME/tools/" ]]; then
mkdir -p "$HOME/tools"
fi
# Delete existing nvim installation.
if [[ -d "$HOME/tools/nvim-osx64" ]]; then
rm -rf "$HOME/tools/nvim-osx64"
# For newer release, the directory name is nvim-macos
if [[ -d "$HOME/tools/nvim-macos" ]]; then
rm -rf "$HOME/tools/nvim-macos"
fi
# Extract the tar ball

View File

@@ -34,11 +34,11 @@ fi
if [[ "$INSTALL_ANACONDA" = true ]]; then
CONDA_DIR=$HOME/tools/anaconda
CONDA_NAME=Anaconda.sh
CONDA_LINK="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.05-Linux-x86_64.sh"
CONDA_LINK="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.11-Linux-x86_64.sh"
else
CONDA_DIR=$HOME/tools/miniconda
CONDA_NAME=Miniconda.sh
CONDA_LINK="https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh"
CONDA_LINK="https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_4.10.3-Linux-x86_64.sh"
fi
if [[ ! "$PYTHON_INSTALLED" = true ]]; then
@@ -68,7 +68,7 @@ fi
# Install some Python packages used by Nvim plugins.
echo "Installing Python packages"
declare -a py_packages=("pynvim" 'python-lsp-server[all]' "black" "vim-vint" "pyls-isort" "pylsp-mypy")
declare -a PY_PACKAGES=("pynvim" 'python-lsp-server[all]' "black" "vim-vint" "pyls-isort" "pylsp-mypy")
if [[ "$SYSTEM_PYTHON" = true ]]; then
echo "Using system Python to install $(PY_PACKAGES)"
@@ -76,32 +76,32 @@ if [[ "$SYSTEM_PYTHON" = true ]]; then
# If we use system Python, we need to install these Python packages under
# user HOME, since we do not have permissions to install them under system
# directories.
for p in "${py_packages[@]}"; do
for p in "${PY_PACKAGES[@]}"; do
pip install --user "$p"
done
else
echo "Using custom Python to install $(PY_PACKAGES)"
for p in "${py_packages[@]}"; do
for p in "${PY_PACKAGES[@]}"; do
"$CONDA_DIR/bin/pip" install "$p"
done
fi
#######################################################################
# Install node and vim-language-server #
# Install node and js-based language server #
#######################################################################
NODE_DIR=$HOME/tools/nodejs
NODE_SRC_NAME=$HOME/packages/nodejs.tar.gz
# when download speed is slow, we can also use its mirror site: https://mirrors.ustc.edu.cn/node/v15.0.0/
NODE_LINK="https://mirrors.ustc.edu.cn/node/v15.0.0/node-v15.0.0-linux-x64.tar.xz"
if [[ -z "$(command -v node)" ]]; then
echo "Install Nodejs"
echo "Install Node.js"
if [[ ! -f $NODE_SRC_NAME ]]; then
echo "Downloading nodejs and renaming"
echo "Downloading Node.js and renaming"
wget $NODE_LINK -O "$NODE_SRC_NAME"
fi
if [[ ! -d "$NODE_DIR" ]]; then
echo "Creating nodejs directory under tools directory"
echo "Creating Node.js directory under tools directory"
mkdir -p "$NODE_DIR"
echo "Extracting to $HOME/tools/nodejs directory"
tar xvf "$NODE_SRC_NAME" -C "$NODE_DIR" --strip-components 1
@@ -111,18 +111,51 @@ if [[ -z "$(command -v node)" ]]; then
echo "export PATH=\"$NODE_DIR/bin:\$PATH\"" >> "$HOME/.bash_profile"
fi
else
echo "Nodejs is already installed. Skip installing it."
echo "Node.js is already installed. Skip installing it."
NODE_DIR="$(realpath $(dirname $(which node))/..)"
fi
# Install vim-language-server
"$NODE_DIR/bin/npm" install -g vim-language-server
# Install bash-language-server
"$NODE_DIR/bin/npm" install -g bash-language-server
#######################################################################
# lua-language-server #
#######################################################################
SUMNEKO_LUA_DIR=$HOME/tools/lua-language-server
SUMNEKO_LUA_SRC_NAME=$HOME/packages/lua-language-server.tar.gz
SUMNEKO_LUA_LINK="https://github.com/sumneko/lua-language-server/releases/download/3.5.3/lua-language-server-3.5.3-linux-x64.tar.gz"
if [[ -z "$(command -v lua-language-server)" ]] && [[ ! -f "$SUMNEKO_LUA_DIR/bin/lua-language-server" ]]; then
echo 'Install lua-language-server'
if [[ ! -f $SUMNEKO_LUA_SRC_NAME ]]; then
echo "Downloading lua-language-server and renaming"
wget $SUMNEKO_LUA_LINK -O "$SUMNEKO_LUA_SRC_NAME"
fi
if [[ ! -d "$SUMNEKO_LUA_DIR" ]]; then
echo "Creating lua-language-server directory under tools directory"
mkdir -p "$SUMNEKO_LUA_DIR"
echo "Extracting to directory $SUMNEKO_LUA_DIR"
tar zxvf "$SUMNEKO_LUA_SRC_NAME" -C "$SUMNEKO_LUA_DIR"
fi
if [[ "$ADD_TO_SYSTEM_PATH" = true ]] && [[ "$USE_BASH_SHELL" = true ]]; then
echo "export PATH=\"$SUMNEKO_LUA_DIR/bin:\$PATH\"" >> "$HOME/.bash_profile"
fi
else
echo "lua-language-server is already installed. Skip installing it."
fi
#######################################################################
# Ripgrep part #
#######################################################################
RIPGREP_DIR=$HOME/tools/ripgrep
RIPGREP_SRC_NAME=$HOME/packages/ripgrep.tar.gz
RIPGREP_LINK="https://hub.fastgit.org/BurntSushi/ripgrep/releases/download/12.0.0/ripgrep-12.0.0-x86_64-unknown-linux-musl.tar.gz"
RIPGREP_LINK="https://github.com/BurntSushi/ripgrep/releases/download/12.0.0/ripgrep-12.0.0-x86_64-unknown-linux-musl.tar.gz"
if [[ -z "$(command -v rg)" ]] && [[ ! -f "$RIPGREP_DIR/rg" ]]; then
echo "Install ripgrep"
if [[ ! -f $RIPGREP_SRC_NAME ]]; then
@@ -140,6 +173,17 @@ if [[ -z "$(command -v rg)" ]] && [[ ! -f "$RIPGREP_DIR/rg" ]]; then
if [[ "$ADD_TO_SYSTEM_PATH" = true ]] && [[ "$USE_BASH_SHELL" = true ]]; then
echo "export PATH=\"$RIPGREP_DIR:\$PATH\"" >> "$HOME/.bash_profile"
fi
# set up manpath and zsh completion for ripgrep
mkdir -p "$HOME/tools/ripgrep/doc/man/man1"
mv "$HOME/tools/ripgrep/doc/rg.1" "$HOME/tools/ripgrep/doc/man/man1"
if [[ "$USE_BASH_SHELL" = true ]]; then
echo 'export MANPATH=$HOME/tools/ripgrep/doc/man:$MANPATH' >> "$HOME/.bash_profile"
else
echo 'export MANPATH=$HOME/tools/ripgrep/doc/man:$MANPATH' >> "$HOME/.zshrc"
echo 'export FPATH=$HOME/tools/ripgrep/complete:$FPATH' >> "$HOME/.zshrc"
fi
else
echo "ripgrep is already installed. Skip installing it."
fi
@@ -149,7 +193,7 @@ fi
#######################################################################
CTAGS_SRC_DIR=$HOME/packages/ctags
CTAGS_DIR=$HOME/tools/ctags
CTAGS_LINK="https://hub.fastgit.org/universal-ctags/ctags.git"
CTAGS_LINK="https://github.com/universal-ctags/ctags.git"
if [[ ! -f "$CTAGS_DIR/bin/ctags" ]]; then
echo "Install ctags"
@@ -177,7 +221,7 @@ fi
NVIM_DIR=$HOME/tools/nvim
NVIM_SRC_NAME=$HOME/packages/nvim-linux64.tar.gz
NVIM_CONFIG_DIR=$HOME/.config/nvim
NVIM_LINK="https://hub.fastgit.org/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz"
NVIM_LINK="https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz"
if [[ ! -f "$NVIM_DIR/bin/nvim" ]]; then
echo "Installing Nvim"
echo "Creating nvim directory under tools directory"
@@ -202,16 +246,19 @@ fi
echo "Setting up config and installing plugins"
if [[ -d "$NVIM_CONFIG_DIR" ]]; then
rm -rf "$NVIM_CONFIG_DIR.backup"
mv "$NVIM_CONFIG_DIR" "$NVIM_CONFIG_DIR.backup"
fi
git clone --depth=1 https://hub.fastgit.org/jdhao/nvim-config.git "$NVIM_CONFIG_DIR"
git clone --depth=1 https://github.com/jdhao/nvim-config.git "$NVIM_CONFIG_DIR"
echo "Installing packer.nvim"
git clone --depth=1 https://hub.fastgit.org/wbthomason/packer.nvim \
~/.local/share/nvim/site/pack/packer/start/packer.nvim
if [[ ! -d ~/.local/share/nvim/site/pack/packer/opt/packer.nvim ]]; then
git clone --depth=1 https://github.com/wbthomason/packer.nvim \
~/.local/share/nvim/site/pack/packer/opt/packer.nvim
fi
echo "Installing plugins"
"$NVIM_DIR/bin/nvim" +PackerInstall +qall
echo "Installing nvim plugins, please wait"
"$NVIM_DIR/bin/nvim" -c "autocmd User PackerComplete quitall" -c "PackerSync"
echo "Finished installing Nvim and its dependencies!"

View File

@@ -1,6 +1,8 @@
# Install scoop
# Set policy to avoid errors
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iwr -useb get.scoop.sh | iex
# Install scoop
Invoke-WebRequest -UseBasicParsing get.scoop.sh | Invoke-Expression
# Install node
scoop install nodejs
@@ -15,7 +17,10 @@ scoop install universal-ctags
# Install vim-language-server
npm install -g vim-language-server
# Install miniconda3
# Install bash-language-server
npm install -g bash-language-server
# Install miniconda3 (for Python)
scoop install miniconda3
# Install pynvim
@@ -24,6 +29,27 @@ pip install -U pynvim
# Install python-language-server
pip install 'python-lsp-server[all]' pylsp-mypy pyls-isort
# Install visual c++ redistribution
scoop install vcredist2022
# Install 7zip
scoop install 7zip
# Install lua-language-server
$sumneko_lua_link = "https://github.com/sumneko/lua-language-server/releases/download/3.5.3/lua-language-server-3.5.3-win32-x64.zip"
$sumneko_lua_install_dir = "D:\portable_tools"
$sumneko_lua_src_dir = "$sumneko_lua_install_dir\lua-language-server.zip"
$sumneko_lua_dir = "$sumneko_lua_install_dir\lua-language-server"
# Download file, ref: https://stackoverflow.com/a/51225744/6064933
Invoke-WebRequest $sumneko_lua_link -OutFile "$sumneko_lua_src_dir"
# Extract the zip file using 7zip, ref: https://stackoverflow.com/a/41933215/6064933
7z x "$sumneko_lua_src_dir" -o"$sumneko_lua_dir"
# Setup PATH env variable, ref: https://stackoverflow.com/q/714877/6064933
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$sumneko_lua_dir\bin", "Machine")
# Install neovim nightly
scoop bucket add versions
scoop install neovim-nightly
scoop install neovim

View File

@@ -3,6 +3,9 @@ inoremap <silent> <S-Insert> <C-R>+
cnoremap <S-Insert> <C-R>+
nnoremap <silent> <C-6> <C-^>
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" config for nvim-qt "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" To check if neovim-qt is running, use `exists('g:GuiLoaded')`,
" see https://github.com/equalsraf/neovim-qt/issues/219
if exists('g:GuiLoaded')
@@ -13,6 +16,9 @@ if exists('g:GuiLoaded')
GuiFont! Hack\ NF:h10:l
endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" config for fvim "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if exists('g:fvim_loaded')
set termguicolors
colorscheme gruvbox8_hard
@@ -53,3 +59,16 @@ if exists('g:fvim_loaded')
FVimUIPopupMenu v:false
endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" config for neovide "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if exists("g:neovide")
set guifont=Hack\ NF:h10
let g:neovide_transparency = 1.0
let g:neovide_cursor_animation_length = 0.1
let g:neovide_cursor_trail_size=0.3
let g:neovide_cursor_vfx_mode = ""
let g:neovide_cursor_vfx_particle_density=10.0
let g:neovide_cursor_vfx_opacity=150.0
endif

38
init.lua Normal file
View File

@@ -0,0 +1,38 @@
-- This is my personal Nvim configuration supporting Mac, Linux and Windows, with various plugins configured.
-- This configuration evolves as I learn more about Nvim and become more proficient in using Nvim.
-- Since it is very long (more than 1000 lines!), you should read it carefully and take only the settings that suit you.
-- I would not recommend cloning this repo and replace your own config. Good configurations are personal,
-- built over time with a lot of polish.
--
-- Author: Jie-dong Hao
-- Email: jdhao@hotmail.com
-- Blog: https://jdhao.github.io/
local api = vim.api
local utils = require("utils")
-- check if we have the latest stable version of nvim
local expected_ver = "0.8.1"
local nvim_ver = utils.get_nvim_version()
if nvim_ver ~= expected_ver then
local msg = string.format("Unsupported nvim version: expect %s, but got %s instead!", expected_ver, nvim_ver)
api.nvim_err_writeln(msg)
return
end
local core_conf_files = {
"globals.lua", -- some global settings
"options.vim", -- setting options in nvim
"autocommands.vim", -- various autocommands
"mappings.lua", -- all the user-defined mappings
"plugins.vim", -- all the plugins installed and their configurations
"colorschemes.lua", -- colorscheme settings
}
-- source all the core config files
for _, name in ipairs(core_conf_files) do
local path = string.format("%s/core/%s", vim.fn.stdpath("config"), name)
local source_cmd = "source " .. path
vim.cmd(source_cmd)
end

View File

@@ -1,26 +0,0 @@
"{ Header info
" Description: This is my personal Nvim configuration supporting Mac, Linux
" and Windows, with various plugins configured. This configuration evolves as
" I learn more about Nvim and becomes more proficient in using Nvim. Since it
" is very long (more than 1000 lines!), you should read it carefully and take
" only the settings and options that suits you. I would not recommend cloning
" this repo and replace your own config. Good configurations are personal,
" built over time with a lot of polish.
" Author: Jie-dong Hao
" Email: jdhao@hotmail.com
"}
"{ Main configurations
let g:config_files = [
\ 'globals.vim',
\ 'options.vim',
\ 'autocommands.vim',
\ 'mappings.vim',
\ 'plugins.vim',
\ 'themes.vim'
\ ]
for s:fname in g:config_files
execute printf('source %s/core/%s', stdpath('config'), s:fname)
endfor
"}

View File

@@ -1,31 +0,0 @@
local alpha = require("alpha")
local dashboard = require("alpha.themes.dashboard")
-- Set header
dashboard.section.header.val = {
" ",
" ███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗███╗ ███╗ ",
" ████╗ ██║██╔════╝██╔═══██╗██║ ██║██║████╗ ████║ ",
" ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║██╔████╔██║ ",
" ██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝██║██║╚██╔╝██║ ",
" ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║ ",
" ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═╝╚═╝ ╚═╝ ",
" ",
}
-- Set menu
dashboard.section.buttons.val = {
dashboard.button( "Leader f f", " > Find file", ":Leaderf file --popup<CR>"),
dashboard.button( "Leader f r", " > Recent files" , ":Leaderf mru --popup<CR>"),
dashboard.button( "Leader f g", " > Project grep" , ":Leaderf rg --popup<CR>"),
dashboard.button( "e", " > New file" , ":enew <CR>"),
dashboard.button( "q", " > Quit NVIM", ":qa<CR>"),
}
local fortune = require("alpha.fortune")
dashboard.section.footer.val = fortune()
alpha.setup(dashboard.opts)
-- Send config to alpha
alpha.setup(dashboard.opts)

View File

@@ -1,15 +0,0 @@
require("autosave").setup({
enabled = true,
execution_message = "Autosaved at " .. vim.fn.strftime("%H:%M:%S"),
events = { "InsertLeave", "TextChanged" },
conditions = {
exists = true,
filename_is_not = {"plugins.lua"},
filetype_is_not = {},
modifiable = true,
},
write_all_buffers = false,
on_off_commands = true,
clean_command_line_interval = 1000,
debounce_delay = 135,
})

View File

@@ -1,6 +1,6 @@
require("bqf").setup({
require("bqf").setup {
auto_resize_height = false,
preview = {
auto_preview = false,
},
}
})

View File

@@ -1,11 +1,14 @@
require("bufferline").setup({
require("bufferline").setup {
options = {
numbers = "buffer_id",
close_command = "bdelete! %d",
right_mouse_command = nil,
left_mouse_command = "buffer %d",
middle_mouse_command = nil,
indicator_icon = "",
indicator = {
icon = "", -- this should be omitted if indicator style is not 'icon'
style = "icon",
},
buffer_close_icon = "",
modified_icon = "",
close_icon = "",
@@ -40,4 +43,4 @@ require("bufferline").setup({
always_show_bufferline = true,
sort_by = "id",
},
})
}

View File

@@ -0,0 +1,68 @@
local api = vim.api
local keymap = vim.keymap
local dashboard = require("dashboard")
dashboard.custom_header = {
" ",
" ",
" ",
" ███╗ ██╗ ███████╗ ██████╗ ██╗ ██╗ ██╗ ███╗ ███╗",
" ████╗ ██║ ██╔════╝██╔═══██╗ ██║ ██║ ██║ ████╗ ████║",
" ██╔██╗ ██║ █████╗ ██║ ██║ ██║ ██║ ██║ ██╔████╔██║",
" ██║╚██╗██║ ██╔══╝ ██║ ██║ ╚██╗ ██╔╝ ██║ ██║╚██╔╝██║",
" ██║ ╚████║ ███████╗╚██████╔╝ ╚████╔╝ ██║ ██║ ╚═╝ ██║",
" ╚═╝ ╚═══╝ ╚══════╝ ╚═════╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝",
" ",
" ",
" ",
" ",
}
dashboard.custom_center = {
{
icon = "",
desc = "Find File ",
action = "Leaderf file --popup",
shortcut = "<Leader> f f",
},
{
icon = "",
desc = "Recently opened files ",
action = "Leaderf mru --popup",
shortcut = "<Leader> f r",
},
{
icon = "",
desc = "Project grep ",
action = "Leaderf rg --popup",
shortcut = "<Leader> f g",
},
{
icon = "",
desc = "Open Nvim config ",
action = "tabnew $MYVIMRC | tcd %:p:h",
shortcut = "<Leader> e v",
},
{
icon = "",
desc = "New file ",
action = "enew",
shortcut = "e ",
},
{
icon = "",
desc = "Quit Nvim ",
-- desc = "Quit Nvim ",
action = "qa",
shortcut = "q ",
},
}
api.nvim_create_autocmd("FileType", {
pattern = "dashboard",
group = api.nvim_create_augroup("dashboard_enter", { clear = true }),
callback = function ()
keymap.set("n", "q", ":qa<CR>", { buffer = true, silent = true })
keymap.set("n", "e", ":enew<CR>", { buffer = true, silent = true })
end
})

View File

@@ -0,0 +1 @@
require("fidget").setup {}

11
lua/config/fugitive.lua Normal file
View File

@@ -0,0 +1,11 @@
local keymap = vim.keymap
keymap.set("n", "<leader>gs", "<cmd>Git<cr>", { desc = "Git status" })
keymap.set("n", "<leader>gw", "<cmd>Gwrite<cr>", { desc = "Git add" })
keymap.set("n", "<leader>gc", "<cmd>Git commit<cr>", { desc = "Git commit" })
keymap.set("n", "<leader>gd", "<cmd>Gdiffsplit<cr>", { desc = "Git diff" })
keymap.set("n", "<leader>gpl", "<cmd>Git pull<cr>", { desc = "Git pull" })
keymap.set("n", "<leader>gpu", "<cmd>15 split|term git push<cr>", { desc = "Git push" })
-- convert git to Git in command line mode
vim.fn['utils#Cabbrev']('git', 'Git')

25
lua/config/git-linker.lua Normal file
View File

@@ -0,0 +1,25 @@
local keymap = vim.keymap
local gitlinker = require("gitlinker")
gitlinker.setup {
mappings = nil,
}
keymap.set({ "n", "v" }, "<leader>gl", "", {
silent = true,
desc = "get git permlink",
callback = function()
local mode = string.lower(vim.fn.mode())
gitlinker.get_buf_range_url(mode)
end,
})
keymap.set("n", "<leader>gb", "", {
silent = true,
desc = "browse repo in browser",
callback = function()
gitlinker.get_repo_url({
action_callback = gitlinker.actions.open_in_browser
})
end
})

57
lua/config/gitsigns.lua Normal file
View File

@@ -0,0 +1,57 @@
local gs = require("gitsigns")
gs.setup {
signs = {
add = { hl = "GitSignsAdd", text = "+", numhl = "GitSignsAddNr", linehl = "GitSignsAddLn" },
change = { hl = "GitSignsChange", text = "~", numhl = "GitSignsChangeNr", linehl = "GitSignsChangeLn" },
delete = { hl = "GitSignsDelete", text = "_", numhl = "GitSignsDeleteNr", linehl = "GitSignsDeleteLn" },
topdelete = { hl = "GitSignsDelete", text = "", numhl = "GitSignsDeleteNr", linehl = "GitSignsDeleteLn" },
changedelete = { hl = "GitSignsChange", text = "", numhl = "GitSignsChangeNr", linehl = "GitSignsChangeLn" },
},
word_diff = true,
on_attach = function(bufnr)
local function map(mode, l, r, opts)
opts = opts or {}
opts.buffer = bufnr
vim.keymap.set(mode, l, r, opts)
end
-- Navigation
map("n", "]c", function()
if vim.wo.diff then
return "]c"
end
vim.schedule(function()
gs.next_hunk()
end)
return "<Ignore>"
end, { expr = true, desc = "next hunk" })
map("n", "[c", function()
if vim.wo.diff then
return "[c"
end
vim.schedule(function()
gs.prev_hunk()
end)
return "<Ignore>"
end, { expr = true, desc = "previous hunk" })
-- Actions
map("n", "<leader>hp", gs.preview_hunk)
map("n", "<leader>hb", function()
gs.blame_line { full = true }
end)
end,
}
vim.api.nvim_create_autocmd('ColorScheme', {
pattern = "*",
callback = function()
vim.cmd [[
hi GitSignsChangeInline gui=reverse
hi GitSignsAddInline gui=reverse
hi GitSignsDeleteInline gui=reverse
]]
end
})

48
lua/config/hlslens.lua Normal file
View File

@@ -0,0 +1,48 @@
local api = vim.api
local keymap = vim.keymap
local hlslens = require("hlslens")
hlslens.setup {
calm_down = true,
nearest_only = true,
}
local activate_hlslens = function(direction)
local cmd = string.format("normal! %s%szzzv", vim.v.count1, direction)
local status, msg = pcall(vim.cmd, cmd)
if not status then
-- 13 is the index where real error message starts
msg = msg:sub(13)
api.nvim_err_writeln(msg)
return
end
hlslens.start()
end
keymap.set("n", "n", "", {
callback = function()
activate_hlslens("n")
end,
})
keymap.set("n", "N", "", {
callback = function()
activate_hlslens("N")
end,
})
keymap.set("n", "*", "", {
callback = function()
vim.fn.execute("normal! *N")
hlslens.start()
end,
})
keymap.set("n", "#", "", {
callback = function()
vim.fn.execute("normal! #N")
hlslens.start()
end,
})

View File

@@ -1,16 +1,29 @@
local api = vim.api
local exclude_ft = { "help", "git", "markdown", "snippets", "text", "gitconfig", "alpha" }
require("indent_blankline").setup {
-- U+2502 may also be a good choice, it will be on the middle of cursor.
-- U+250A is also a good choice
char = "",
show_end_of_line = false,
disable_with_nolist = true,
buftype_exclude = { "terminal" },
filetype_exclude = { "help", "git", "markdown", "snippets", "text" },
filetype_exclude = exclude_ft,
}
vim.cmd[[
augroup indent_blankline
autocmd!
autocmd InsertEnter * IndentBlanklineDisable
autocmd InsertLeave * IndentBlanklineEnable
augroup END
]]
local gid = api.nvim_create_augroup("indent_blankline", { clear = true })
api.nvim_create_autocmd("InsertEnter", {
pattern = "*",
group = gid,
command = "IndentBlanklineDisable",
})
api.nvim_create_autocmd("InsertLeave", {
pattern = "*",
group = gid,
callback = function()
if not vim.tbl_contains(exclude_ft, vim.bo.filetype) then
vim.cmd([[IndentBlanklineEnable]])
end
end,
})

View File

@@ -1,7 +1,7 @@
local iron = require("iron")
iron.core.set_config({
iron.core.set_config {
preferred = {
python = "ipython",
},
repl_open_cmd = "vertical 120 split",
})
}

View File

@@ -1,78 +1,105 @@
local M = {}
local fn = vim.fn
local api = vim.api
local keymap = vim.keymap
local lsp = vim.lsp
local diagnostic = vim.diagnostic
function M.show_line_diagnostics()
local opts = {
focusable = false,
close_events = { "BufLeave", "CursorMoved", "InsertEnter", "FocusLost" },
border = 'single'
}
vim.lsp.diagnostic.show_line_diagnostics(opts)
end
local utils = require("utils")
local custom_attach = function(client, bufnr)
local function buf_set_keymap(...)
vim.api.nvim_buf_set_keymap(bufnr, ...)
end
local function buf_set_option(...)
vim.api.nvim_buf_set_option(bufnr, ...)
end
buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc")
-- Mappings.
local opts = { noremap = true, silent = true }
buf_set_keymap("n", "gd", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
buf_set_keymap("n", "<C-]>", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
buf_set_keymap("n", "K", "<Cmd>lua vim.lsp.buf.hover()<CR>", opts)
buf_set_keymap("n", "<C-k>", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts)
buf_set_keymap("n", "<space>wa", "<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>", opts)
buf_set_keymap("n", "<space>wr", "<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>", opts)
buf_set_keymap("n", "<space>wl", "<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>", opts)
buf_set_keymap("n", "<space>rn", "<cmd>lua vim.lsp.buf.rename()<CR>", opts)
buf_set_keymap("n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts)
buf_set_keymap("n", "[d", "<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>", opts)
buf_set_keymap("n", "]d", "<cmd>lua vim.lsp.diagnostic.goto_next()<CR>", opts)
buf_set_keymap("n", "<space>q", "<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>", opts)
buf_set_keymap("n", "<space>ca", "<cmd>lua vim.lsp.buf.code_action()<CR>", opts)
local map = function(mode, l, r, opts)
opts = opts or {}
opts.silent = true
opts.buffer = bufnr
keymap.set(mode, l, r, opts)
end
vim.cmd([[
autocmd CursorHold <buffer> lua require('config.lsp').show_line_diagnostics()
]])
map("n", "gd", vim.lsp.buf.definition, { desc = "go to definition" })
map("n", "<C-]>", vim.lsp.buf.definition)
map("n", "K", vim.lsp.buf.hover)
map("n", "<C-k>", vim.lsp.buf.signature_help)
map("n", "<space>rn", vim.lsp.buf.rename, { desc = "varialbe rename" })
map("n", "gr", vim.lsp.buf.references, { desc = "show references" })
map("n", "[d", diagnostic.goto_prev, { desc = "previous diagnostic" })
map("n", "]d", diagnostic.goto_next, { desc = "next diagnostic" })
map("n", "<space>q", diagnostic.setqflist, { desc = "put diagnostic to qf" })
map("n", "<space>ca", vim.lsp.buf.code_action, { desc = "LSP code action" })
map("n", "<space>wa", vim.lsp.buf.add_workspace_folder, { desc = "add workspace folder" })
map("n", "<space>wr", vim.lsp.buf.remove_workspace_folder, { desc = "remove workspace folder" })
map("n", "<space>wl", function()
inspect(vim.lsp.buf.list_workspace_folders())
end, { desc = "list workspace folder" })
-- Set some key bindings conditional on server capabilities
if client.resolved_capabilities.document_formatting then
buf_set_keymap("n", "<space>f", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
if client.server_capabilities.documentFormattingProvider then
map("n", "<space>f", vim.lsp.buf.format, { desc = "format code" })
end
if client.resolved_capabilities.document_range_formatting then
buf_set_keymap("x", "<space>f", "<cmd>lua vim.lsp.buf.range_formatting()<CR><ESC>", opts)
api.nvim_create_autocmd("CursorHold", {
buffer = bufnr,
callback = function()
local float_opts = {
focusable = false,
close_events = { "BufLeave", "CursorMoved", "InsertEnter", "FocusLost" },
border = "rounded",
source = "always", -- show source in diagnostic popup window
prefix = " ",
}
if not vim.b.diagnostics_pos then
vim.b.diagnostics_pos = { nil, nil }
end
local cursor_pos = api.nvim_win_get_cursor(0)
if (cursor_pos[1] ~= vim.b.diagnostics_pos[1] or cursor_pos[2] ~= vim.b.diagnostics_pos[2])
and #diagnostic.get() > 0
then
diagnostic.open_float(nil, float_opts)
end
vim.b.diagnostics_pos = cursor_pos
end,
})
-- The blow command will highlight the current variable and its usages in the buffer.
if client.resolved_capabilities.document_highlight then
if client.server_capabilities.documentHighlightProvider then
vim.cmd([[
hi link LspReferenceRead Visual
hi link LspReferenceText Visual
hi link LspReferenceWrite Visual
augroup lsp_document_highlight
autocmd! * <buffer>
autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()
autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()
augroup END
hi! link LspReferenceRead Visual
hi! link LspReferenceText Visual
hi! link LspReferenceWrite Visual
]])
local gid = api.nvim_create_augroup("lsp_document_highlight", { clear = true })
api.nvim_create_autocmd("CursorHold" , {
group = gid,
buffer = bufnr,
callback = function ()
lsp.buf.document_highlight()
end
})
api.nvim_create_autocmd("CursorMoved" , {
group = gid,
buffer = bufnr,
callback = function ()
lsp.buf.clear_references()
end
})
end
if vim.g.logging_level == 'debug' then
if vim.g.logging_level == "debug" then
local msg = string.format("Language server %s started!", client.name)
vim.notify(msg, 'info', {title = 'Nvim-config'})
vim.notify(msg, vim.log.levels.DEBUG, { title = "Nvim-config" })
end
end
local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())
capabilities.textDocument.completion.completionItem.snippetSupport = true
local capabilities = require('cmp_nvim_lsp').default_capabilities()
local lspconfig = require("lspconfig")
lspconfig.pylsp.setup({
if utils.executable("pylsp") then
lspconfig.pylsp.setup {
on_attach = custom_attach,
settings = {
pylsp = {
@@ -90,117 +117,107 @@ lspconfig.pylsp.setup({
debounce_text_changes = 200,
},
capabilities = capabilities,
})
}
else
vim.notify("pylsp not found!", vim.log.levels.WARN, { title = "Nvim-config" })
end
-- if utils.executable('pyright') then
-- lspconfig.pyright.setup{
-- on_attach = custom_attach,
-- capabilities = capabilities
-- }
-- else
-- vim.notify("pyright not found!", vim.log.levels.WARN, {title = 'Nvim-config'})
-- end
lspconfig.clangd.setup({
if utils.executable("clangd") then
lspconfig.clangd.setup {
on_attach = custom_attach,
capabilities = capabilities,
filetypes = { "c", "cpp", "cc" },
flags = {
debounce_text_changes = 500,
},
})
}
else
vim.notify("clangd not found!", vim.log.levels.WARN, { title = "Nvim-config" })
end
-- set up vim-language-server
lspconfig.vimls.setup({
if utils.executable("vim-language-server") then
lspconfig.vimls.setup {
on_attach = custom_attach,
flags = {
debounce_text_changes = 500,
},
capabilities = capabilities,
})
}
else
vim.notify("vim-language-server not found!", vim.log.levels.WARN, { title = "Nvim-config" })
end
local sumneko_binary_path = vim.fn.exepath("lua-language-server")
if vim.g.is_mac or vim.g.is_linux and sumneko_binary_path ~= "" then
local sumneko_root_path = vim.fn.fnamemodify(sumneko_binary_path, ":h:h:h")
local runtime_path = vim.split(package.path, ";")
table.insert(runtime_path, "lua/?.lua")
table.insert(runtime_path, "lua/?/init.lua")
require("lspconfig").sumneko_lua.setup({
-- set up bash-language-server
if utils.executable("bash-language-server") then
lspconfig.bashls.setup {
on_attach = custom_attach,
capabilities = capabilities,
}
end
if utils.executable("lua-language-server") then
-- settings for lua-language-server can be found on https://github.com/sumneko/lua-language-server/wiki/Settings .
lspconfig.sumneko_lua.setup {
on_attach = custom_attach,
cmd = { sumneko_binary_path, "-E", sumneko_root_path .. "/main.lua" },
settings = {
Lua = {
runtime = {
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
version = "LuaJIT",
-- Setup your lua path
path = runtime_path,
},
diagnostics = {
-- Get the language server to recognize the `vim` global
globals = { "vim" },
},
workspace = {
-- Make the server aware of Neovim runtime files
library = vim.api.nvim_get_runtime_file("", true),
-- Make the server aware of Neovim runtime files,
-- see also https://github.com/sumneko/lua-language-server/wiki/Libraries#link-to-workspace .
-- Lua-dev.nvim also has similar settings for sumneko lua, https://github.com/folke/lua-dev.nvim/blob/main/lua/lua-dev/sumneko.lua .
library = {
fn.stdpath("data") .. "/site/pack/packer/opt/emmylua-nvim",
fn.stdpath("config"),
},
-- Do not send telemetry data containing a randomized but unique identifier
telemetry = {
enable = false,
maxPreload = 2000,
preloadFileSize = 50000,
},
},
},
capabilities = capabilities,
})
}
end
-- Change diagnostic signs.
vim.fn.sign_define("LspDiagnosticsSignError", { text = "", texthl = "LspDiagnosticsDefaultError" })
vim.fn.sign_define("LspDiagnosticsSignWarning", { text = "!", texthl = "LspDiagnosticsDefaultWarning" })
vim.fn.sign_define("LspDiagnosticsSignInformation", { text = "", texthl = "LspDiagnosticsDefaultInformation" })
vim.fn.sign_define("LspDiagnosticsSignHint", { text = "", texthl = "LspDiagnosticsDefaultHint" })
fn.sign_define("DiagnosticSignError", { text = "", texthl = "DiagnosticSignError" })
fn.sign_define("DiagnosticSignWarn", { text = "!", texthl = "DiagnosticSignWarn" })
fn.sign_define("DiagnosticSignInformation", { text = "", texthl = "DiagnosticSignInfo" })
fn.sign_define("DiagnosticSignHint", { text = "", texthl = "DiagnosticSignHint" })
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
-- global config for diagnostic
diagnostic.config {
underline = false,
virtual_text = false,
signs = true,
update_in_insert = false,
})
-- Refs: https://github.com/neovim/nvim-lspconfig/wiki/UI-customization#show-source-in-diagnostics
vim.lsp.handlers["textDocument/publishDiagnostics"] = function(_, result, context, _)
-- result contains diagnostics and uri
-- context contains client_id and method, but not always buf_nr
local client_id = context.client_id
local diagnostics = result.diagnostics
local uri = result.uri
local bufnr = vim.uri_to_bufnr(uri)
if not bufnr then
return
end
if not vim.api.nvim_buf_is_loaded(bufnr) then
return
end
-- change diagnostics format
for i, v in ipairs(diagnostics) do
diagnostics[i].message = string.format("%s: %s", v.source, v.message)
end
vim.lsp.diagnostic.save(diagnostics, bufnr, client_id)
local config = {
underline = false,
virtual_text = false,
signs = true,
update_in_insert = false,
severity_sort = true,
}
vim.lsp.diagnostic.display(diagnostics, bufnr, client_id, config)
end
-- The following settings works with the bleeding edge neovim.
-- See https://github.com/neovim/neovim/pull/13998.
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
-- lsp.handlers["textDocument/publishDiagnostics"] = lsp.with(lsp.diagnostic.on_publish_diagnostics, {
-- underline = false,
-- virtual_text = false,
-- signs = true,
-- update_in_insert = false,
-- })
-- Change border of documentation hover window, See https://github.com/neovim/neovim/pull/13998.
lsp.handlers["textDocument/hover"] = lsp.with(vim.lsp.handlers.hover, {
border = "rounded",
})
return M

View File

@@ -1,21 +0,0 @@
require("neoscroll").setup({
easing_function = "quadratic",
})
local t = {}
-- Syntax: t[keys] = {function, {function arguments}}
-- Use the "sine" easing function
t["<C-u>"] = { "scroll", { "-vim.wo.scroll", "true", "20", [['cubic']] } }
t["<C-d>"] = { "scroll", { "vim.wo.scroll", "true", "20", [['cubic']] } }
-- Use the "circular" easing function
t["<C-b>"] = { "scroll", { "-vim.api.nvim_win_get_height(0)", "true", "50", [['cubic']] } }
t["<C-f>"] = { "scroll", { "vim.api.nvim_win_get_height(0)", "true", "50", [['cubic']] } }
-- Pass "nil" to disable the easing animation (constant scrolling speed)
t["<C-y>"] = { "scroll", { "-0.10", "false", "100", nil } }
t["<C-e>"] = { "scroll", { "0.10", "false", "100", nil } }
-- When no easing function is provided the default easing function (in this case "quadratic") will be used
t["zt"] = { "zt", { "10" } }
t["zz"] = { "zz", { "10" } }
t["zb"] = { "zb", { "10" } }
require("neoscroll.config").set_mappings(t)

View File

@@ -1,52 +1,52 @@
-- Setup nvim-cmp.
local cmp = require'cmp'
local lspkind = require'lspkind'
local cmp = require("cmp")
local lspkind = require("lspkind")
cmp.setup({
cmp.setup {
snippet = {
expand = function(args)
-- For `ultisnips` user.
vim.fn["UltiSnips#Anon"](args.body)
end,
},
mapping = {
['<Tab>'] = function(fallback)
mapping = cmp.mapping.preset.insert {
["<Tab>"] = function(fallback)
if cmp.visible() then
cmp.select_next_item()
else
fallback()
end
end,
['<S-Tab>'] = function(fallback)
["<S-Tab>"] = function(fallback)
if cmp.visible() then
cmp.select_prev_item()
else
fallback()
end
end,
['<Esc>'] = cmp.mapping.close(),
['<CR>'] = cmp.mapping.confirm({ select = true }),
['<C-d>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
["<CR>"] = cmp.mapping.confirm { select = true },
["<C-e>"] = cmp.mapping.abort(),
["<Esc>"] = cmp.mapping.close(),
["<C-d>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
},
sources = {
{ name = 'nvim_lsp' }, -- For nvim-lsp
{ name = 'ultisnips' }, -- For ultisnips user.
{ name = 'nvim_lua' }, -- for nvim lua function
{ name = 'path' }, -- for path completion
{ name = 'buffer', keyword_length = 4 }, -- for buffer word completion
{ name = 'emoji', insert = true, } -- emoji completion
{ name = "nvim_lsp" }, -- For nvim-lsp
{ name = "ultisnips" }, -- For ultisnips user.
{ name = "path" }, -- for path completion
{ name = "buffer", keyword_length = 2 }, -- for buffer word completion
{ name = "emoji", insert = true }, -- emoji completion
},
completion = {
keyword_length = 1,
completeopt = "menu,noselect"
completeopt = "menu,noselect",
},
experimental = {
ghost_text = false
view = {
entries = "custom",
},
formatting = {
format = lspkind.cmp_format({
with_text = false,
format = lspkind.cmp_format {
mode = "symbol_text",
menu = {
nvim_lsp = "[LSP]",
ultisnips = "[US]",
@@ -54,9 +54,38 @@ cmp.setup({
path = "[Path]",
buffer = "[Buffer]",
emoji = "[Emoji]",
omni = "[Omni]",
},
}),
},
},
}
cmp.setup.filetype("tex", {
sources = {
{ name = "omni" },
{ name = "ultisnips" }, -- For ultisnips user.
{ name = "buffer", keyword_length = 2 }, -- for buffer word completion
{ name = "path" }, -- for path completion
},
})
vim.cmd("hi link CmpItemMenu Comment")
-- see https://github.com/hrsh7th/nvim-cmp/wiki/Menu-Appearance#how-to-add-visual-studio-code-dark-theme-colors-to-the-menu
vim.cmd([[
highlight! link CmpItemMenu Comment
" gray
highlight! CmpItemAbbrDeprecated guibg=NONE gui=strikethrough guifg=#808080
" blue
highlight! CmpItemAbbrMatch guibg=NONE guifg=#569CD6
highlight! CmpItemAbbrMatchFuzzy guibg=NONE guifg=#569CD6
" light blue
highlight! CmpItemKindVariable guibg=NONE guifg=#9CDCFE
highlight! CmpItemKindInterface guibg=NONE guifg=#9CDCFE
highlight! CmpItemKindText guibg=NONE guifg=#9CDCFE
" pink
highlight! CmpItemKindFunction guibg=NONE guifg=#C586C0
highlight! CmpItemKindMethod guibg=NONE guifg=#C586C0
" front
highlight! CmpItemKindKeyword guibg=NONE guifg=#D4D4D4
highlight! CmpItemKindProperty guibg=NONE guifg=#D4D4D4
highlight! CmpItemKindUnit guibg=NONE guifg=#D4D4D4
]])

View File

@@ -1,9 +1,10 @@
local nvim_notify = require("notify")
nvim_notify.setup({
nvim_notify.setup {
-- Animation style
stages = "fade_in_slide_out",
-- Default timeout for notifications
timeout = 1500,
})
background_colour = "#2E3440",
}
vim.notify = nvim_notify

118
lua/config/nvim-tree.lua Normal file
View File

@@ -0,0 +1,118 @@
local keymap = vim.keymap
local nvim_tree = require("nvim-tree")
nvim_tree.setup {
auto_reload_on_write = true,
disable_netrw = false,
hijack_cursor = false,
hijack_netrw = true,
hijack_unnamed_buffer_when_opening = false,
ignore_buffer_on_setup = false,
open_on_setup = false,
open_on_setup_file = false,
open_on_tab = false,
sort_by = "name",
update_cwd = false,
view = {
width = 30,
hide_root_folder = false,
side = "left",
preserve_window_proportions = false,
number = false,
relativenumber = false,
signcolumn = "yes",
mappings = {
custom_only = false,
list = {
-- user mappings go here
},
},
},
renderer = {
indent_markers = {
enable = false,
icons = {
corner = "",
edge = "",
none = " ",
},
},
icons = {
webdev_colors = true,
},
},
hijack_directories = {
enable = true,
auto_open = true,
},
update_focused_file = {
enable = false,
update_cwd = false,
ignore_list = {},
},
ignore_ft_on_setup = {},
system_open = {
cmd = "",
args = {},
},
diagnostics = {
enable = false,
show_on_dirs = false,
icons = {
hint = "",
info = "",
warning = "",
error = "",
},
},
filters = {
dotfiles = false,
custom = {},
exclude = {},
},
git = {
enable = true,
ignore = true,
timeout = 400,
},
actions = {
use_system_clipboard = true,
change_dir = {
enable = true,
global = false,
restrict_above_cwd = false,
},
open_file = {
quit_on_open = false,
resize_window = false,
window_picker = {
enable = true,
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
exclude = {
filetype = { "notify", "packer", "qf", "diff", "fugitive", "fugitiveblame" },
buftype = { "nofile", "terminal", "help" },
},
},
},
},
trash = {
cmd = "trash",
require_confirm = true,
},
log = {
enable = false,
truncate = false,
types = {
all = false,
config = false,
copy_paste = false,
diagnostics = false,
git = false,
profile = false,
},
},
}
keymap.set("n", "<space>s", function()
return require("nvim-tree").toggle(false, true)
end, { silent = true, desc = "toggle nvim-tree" })

View File

@@ -1,6 +1,20 @@
vim.cmd[[ hi HopNextKey cterm=bold ctermfg=176 gui=bold guibg=#ff00ff guifg=#ffffff ]]
require('hop').setup({
case_insensitive = true,
})
vim.cmd([[hi HopNextKey cterm=bold ctermfg=176 gui=bold guibg=#ff00ff guifg=#ffffff]])
vim.cmd([[hi HopNextKey1 cterm=bold ctermfg=176 gui=bold guibg=#ff00ff guifg=#ffffff]])
vim.cmd([[hi HopNextKey2 cterm=bold ctermfg=176 gui=bold guibg=#ff00ff guifg=#ffffff]])
vim.api.nvim_set_keymap('n', 'f', "<cmd>lua require'hop'.hint_char2()<cr>", {noremap = true})
local keymap = vim.keymap
local hop = require("hop")
hop.setup {
case_insensitive = true,
char2_fallback_key = "<CR>",
quit_key = "<Esc>",
}
keymap.set({ "n", "v", "o" }, "f", "", {
silent = true,
noremap = true,
callback = function()
hop.hint_char2()
end,
desc = "nvim-hop char2",
})

170
lua/config/statusline.lua Normal file
View File

@@ -0,0 +1,170 @@
local fn = vim.fn
local function spell()
if vim.o.spell then
return string.format("[SPELL]")
end
return ""
end
--- show indicator for Chinese IME
local function ime_state()
if vim.g.is_mac then
-- ref: https://github.com/vim-airline/vim-airline/blob/master/autoload/airline/extensions/xkblayout.vim#L11
local layout = fn.libcall(vim.g.XkbSwitchLib, "Xkb_Switch_getXkbLayout", "")
-- We can use `xkbswitch -g` on the command line to get current mode.
-- mode for macOS builtin pinyin IME: com.apple.inputmethod.SCIM.ITABC
-- mode for Rime: im.rime.inputmethod.Squirrel.Rime
local res = fn.match(layout, [[\v(Squirrel\.Rime|SCIM.ITABC)]])
if res ~= -1 then
return "[CN]"
end
end
return ""
end
local function trailing_space()
if not vim.o.modifiable then
return ""
end
local line_num = nil
for i = 1, fn.line("$") do
local linetext = fn.getline(i)
-- To prevent invalid escape error, we wrap the regex string with `[[]]`.
local idx = fn.match(linetext, [[\v\s+$]])
if idx ~= -1 then
line_num = i
break
end
end
local msg = ""
if line_num ~= nil then
msg = string.format("[%d]trailing", line_num)
end
return msg
end
local function mixed_indent()
if not vim.o.modifiable then
return ""
end
local space_pat = [[\v^ +]]
local tab_pat = [[\v^\t+]]
local space_indent = fn.search(space_pat, "nwc")
local tab_indent = fn.search(tab_pat, "nwc")
local mixed = (space_indent > 0 and tab_indent > 0)
local mixed_same_line
if not mixed then
mixed_same_line = fn.search([[\v^(\t+ | +\t)]], "nwc")
mixed = mixed_same_line > 0
end
if not mixed then
return ""
end
if mixed_same_line ~= nil and mixed_same_line > 0 then
return "MI:" .. mixed_same_line
end
local space_indent_cnt = fn.searchcount({ pattern = space_pat, max_count = 1e3 }).total
local tab_indent_cnt = fn.searchcount({ pattern = tab_pat, max_count = 1e3 }).total
if space_indent_cnt > tab_indent_cnt then
return "MI:" .. tab_indent
else
return "MI:" .. space_indent
end
end
local diff = function()
local git_status = vim.b.gitsigns_status_dict
if git_status == nil then
return
end
local modify_num = git_status.changed
local remove_num = git_status.removed
local add_num = git_status.added
local info = { added = add_num, modified = modify_num, removed = remove_num }
-- vim.pretty_print(info)
return info
end
require("lualine").setup {
options = {
icons_enabled = true,
theme = "auto",
-- component_separators = { left = "", right = "" },
-- section_separators = { left = "", right = "" },
section_separators = "",
component_separators = "",
disabled_filetypes = {},
always_divide_middle = true,
},
sections = {
lualine_a = { "mode" },
lualine_b = {
"branch",
{
"diff",
source = diff,
},
},
lualine_c = {
"filename",
{
ime_state,
color = { fg = "black", bg = "#f46868" },
},
{
spell,
color = { fg = "black", bg = "#a7c080" },
},
},
lualine_x = {
"encoding",
{
"fileformat",
symbols = {
unix = "unix",
dos = "win",
mac = "mac",
},
},
"filetype",
},
lualine_y = { "progress" },
lualine_z = {
"location",
{
"diagnostics",
sources = { "nvim_diagnostic" },
},
{
trailing_space,
color = "WarningMsg",
},
{
mixed_indent,
color = "WarningMsg",
},
},
},
inactive_sections = {
lualine_a = {},
lualine_b = {},
lualine_c = { "filename" },
lualine_x = { "location" },
lualine_y = {},
lualine_z = {},
},
tabline = {},
extensions = { "quickfix", "fugitive", "nvim-tree" },
}

View File

@@ -1,8 +1,8 @@
require("nvim-treesitter.configs").setup({
require("nvim-treesitter.configs").setup {
ensure_installed = { "python", "cpp", "lua", "vim" },
ignore_install = {}, -- List of parsers to ignore installing
highlight = {
enable = true, -- false will disable the whole extension
disable = {}, -- list of language that will be disabled
disable = { 'help' }, -- list of language that will be disabled
},
})
}

View File

@@ -1,4 +1,4 @@
require("which-key").setup({
require("which-key").setup {
plugins = {
marks = true, -- shows a list of your marks on ' and `
registers = true, -- shows your registers on " in NORMAL or <C-r> in INSERT mode
@@ -57,4 +57,4 @@ require("which-key").setup({
-- most people should not need to change this
n = { "o", "O" },
},
})
}

View File

@@ -1,4 +1,4 @@
require("zen-mode").setup({
require("zen-mode").setup {
window = {
backdrop = 0.8, -- shade the backdrop of the Zen window. Set to 1 to keep the same as Normal
width = 120,
@@ -12,4 +12,4 @@ require("zen-mode").setup({
list = false, -- disable whitespace characters
},
},
})
}

66
lua/custom-autocmd.lua Normal file
View File

@@ -0,0 +1,66 @@
local fn = vim.fn
local api = vim.api
local utils = require("utils")
-- Display a message when the current file is not in utf-8 format.
-- Note that we need to use `unsilent` command here because of this issue:
-- https://github.com/vim/vim/issues/4379
api.nvim_create_autocmd({ "BufRead" }, {
pattern = "*",
group = api.nvim_create_augroup("non_utf8_file", { clear = true }),
callback = function()
if vim.bo.fileencoding ~= "utf-8" then
vim.notify("File not in UTF-8 format!", vim.log.levels.WARN, { title = "nvim-config" })
end
end,
})
-- highlight yanked region, see `:h lua-highlight`
api.nvim_create_autocmd({ "TextYankPost" }, {
pattern = "*",
group = api.nvim_create_augroup("highlight_yank", { clear = true }),
callback = function()
vim.highlight.on_yank { higroup = "YankColor", timeout = 300 }
end,
})
-- Auto-create dir when saving a file, in case some intermediate directory does not exist
api.nvim_create_autocmd({ "BufWritePre" }, {
pattern = "*",
group = api.nvim_create_augroup("auto_create_dir", { clear = true }),
callback = function(ctx)
local dir = fn.fnamemodify(ctx.file, ":p:h")
utils.may_create_dir(dir)
end,
})
-- Automatically reload the file if it is changed outside of Nvim, see https://unix.stackexchange.com/a/383044/221410.
-- It seems that `checktime` does not work in command line. We need to check if we are in command
-- line before executing this command, see also https://vi.stackexchange.com/a/20397/15292 .
api.nvim_create_augroup("auto_read", { clear = true })
api.nvim_create_autocmd({ "FileChangedShellPost" }, {
pattern = "*",
group = "auto_read",
callback = function()
vim.notify("File changed on disk. Buffer reloaded!", vim.log.levels.WARN, { title = "nvim-config" })
end,
})
api.nvim_create_autocmd({ "FocusGained", "CursorHold" }, {
pattern = "*",
group = "auto_read",
callback = function()
if fn.getcmdwintype() == "" then
vim.cmd("checktime")
end
end,
})
-- Resize all windows when we resize the terminal
api.nvim_create_autocmd("VimResized", {
group = api.nvim_create_augroup("win_autoresize", { clear = true }),
desc = "autoresize windows on resizing operation",
command = "wincmd =",
})

View File

@@ -1,5 +0,0 @@
-- Some utility stuff
require 'utils'
-- plugin installation
require 'plugins'

View File

@@ -1,325 +1,395 @@
local utils = require("utils")
local api = vim.api
local fn = vim.fn
vim.g.package_home = fn.stdpath("data") .. "/site/pack/packer/"
local packer_install_dir = vim.g.package_home .. "/opt/packer.nvim"
local utils = require("utils")
local plug_url_format = ""
if vim.g.is_linux then
plug_url_format = "https://hub.fastgit.org/%s"
else
plug_url_format = "https://github.com/%s"
-- The root dir to install all plugins. Plugins are under opt/ or start/ sub-directory.
vim.g.plugin_home = fn.stdpath("data") .. "/site/pack/packer"
--- Install packer if it has not been installed.
--- Return:
--- true: if this is a fresh install of packer
--- false: if packer has been installed
local function packer_ensure_install()
-- Where to install packer.nvim -- the package manager (we make it opt)
local packer_dir = vim.g.plugin_home .. "/opt/packer.nvim"
if fn.glob(packer_dir) ~= "" then
return false
end
local packer_repo = string.format(plug_url_format, "wbthomason/packer.nvim")
local install_cmd = string.format("10split |term git clone --depth=1 %s %s", packer_repo, packer_install_dir)
-- Auto-install packer in case it hasn't been installed.
if fn.glob(packer_install_dir) == "" then
vim.api.nvim_echo({ { "Installing packer.nvim", "Type" } }, true, {})
local packer_repo = "https://github.com/wbthomason/packer.nvim"
local install_cmd = string.format("!git clone --depth=1 %s %s", packer_repo, packer_dir)
vim.cmd(install_cmd)
return true
end
local fresh_install = packer_ensure_install()
-- Load packer.nvim
vim.cmd("packadd packer.nvim")
require("packer").startup({
function(use)
use({"wbthomason/packer.nvim", opt = true})
local packer = require("packer")
local packer_util = require("packer.util")
use {"onsails/lspkind-nvim", event = "BufEnter"}
-- check if firenvim is active
local firenvim_not_active = function()
return not vim.g.started_by_firenvim
end
packer.startup {
function(use)
-- it is recommended to put impatient.nvim before any other plugins
use { "lewis6991/impatient.nvim", config = [[require('impatient')]] }
use { "wbthomason/packer.nvim", opt = true }
use { "onsails/lspkind-nvim", event = "VimEnter" }
-- auto-completion engine
use { "hrsh7th/nvim-cmp", after = "lspkind-nvim", config = [[require('config.nvim-cmp')]] }
-- nvim-cmp completion sources
use { "hrsh7th/cmp-nvim-lsp", after = "nvim-cmp" }
-- nvim-lsp configuration (it relies on cmp-nvim-lsp, so it should be loaded after cmp-nvim-lsp).
use({ "neovim/nvim-lspconfig", after = "cmp-nvim-lsp", config = [[require('config.lsp')]] })
use {"hrsh7th/cmp-nvim-lua", after = "nvim-cmp"}
use { "hrsh7th/cmp-path", after = "nvim-cmp" }
use { "hrsh7th/cmp-buffer", after = "nvim-cmp" }
-- use {"hrsh7th/cmp-cmdline", after = "nvim-cmp"}
use {"quangnguyen30192/cmp-nvim-ultisnips", after = {'nvim-cmp', 'ultisnips'}}
use { "hrsh7th/cmp-omni", after = "nvim-cmp" }
use { "quangnguyen30192/cmp-nvim-ultisnips", after = { "nvim-cmp", "ultisnips" } }
if vim.g.is_mac then
use {"hrsh7th/cmp-emoji", after = 'nvim-cmp'}
use { "hrsh7th/cmp-emoji", after = "nvim-cmp" }
end
if vim.g.is_mac then
use({ "nvim-treesitter/nvim-treesitter", event = 'BufEnter', run = ":TSUpdate", config = [[require('config.treesitter')]] })
end
-- nvim-lsp configuration (it relies on cmp-nvim-lsp, so it should be loaded after cmp-nvim-lsp).
use { "neovim/nvim-lspconfig", after = "cmp-nvim-lsp", config = [[require('config.lsp')]] }
-- Python syntax highlighting and more
if vim.g.is_win then
use({ "numirias/semshi", ft = "python", config = "vim.cmd [[UpdateRemotePlugins]]" })
if vim.g.is_mac then
use {
"nvim-treesitter/nvim-treesitter",
event = "BufEnter",
run = ":TSUpdate",
config = [[require('config.treesitter')]],
}
end
-- Python indent (follows the PEP8 style)
use({ "Vimjas/vim-python-pep8-indent", ft = { "python" } })
use { "Vimjas/vim-python-pep8-indent", ft = { "python" } }
-- Python-related text object
use({ "jeetsukumaran/vim-pythonsense", ft = { "python" } })
use { "jeetsukumaran/vim-pythonsense", ft = { "python" } }
use({"machakann/vim-swap", event = "VimEnter"})
use { "machakann/vim-swap", event = "VimEnter" }
-- IDE for Lisp
if utils.executable("sbcl") then
-- use 'kovisoft/slimv'
use({ "vlime/vlime", rtp = "vim/", ft = { "lisp" } })
use { "vlime/vlime", rtp = "vim/", ft = { "lisp" } }
end
-- Super fast buffer jump
use { 'phaazon/hop.nvim', event = "VimEnter", config = [[require('config.nvim_hop')]] }
use {
"phaazon/hop.nvim",
event = "VimEnter",
config = function()
vim.defer_fn(function()
require("config.nvim_hop")
end, 2000)
end,
}
-- Clear highlight search automatically for you
use({"romainl/vim-cool", event = "VimEnter"})
-- Show current search term in different color
use({"PeterRincker/vim-searchlight", event = "VimEnter"})
-- Show match number for search
use({"kevinhwang91/nvim-hlslens", event = 'VimEnter'})
-- Stay after pressing * and search selected text
use({"haya14busa/vim-asterisk", event = 'VimEnter'})
-- Show match number and index for searching
use {
"kevinhwang91/nvim-hlslens",
branch = "main",
keys = { { "n", "*" }, { "n", "#" }, { "n", "n" }, { "n", "N" } },
config = [[require('config.hlslens')]],
}
-- File search, tag search and more
if vim.g.is_win then
use({"Yggdroot/LeaderF", cmd = "Leaderf"})
use { "Yggdroot/LeaderF", cmd = "Leaderf" }
else
use({ "Yggdroot/LeaderF", cmd = "Leaderf", run = ":LeaderfInstallCExtension" })
use { "Yggdroot/LeaderF", cmd = "Leaderf", run = ":LeaderfInstallCExtension" }
end
use {
'nvim-telescope/telescope.nvim',
requires = { {'nvim-lua/plenary.nvim'} }
"nvim-telescope/telescope.nvim",
cmd = "Telescope",
requires = { { "nvim-lua/plenary.nvim" } },
}
-- search emoji and other symbols
use 'nvim-telescope/telescope-symbols.nvim'
-- Another similar plugin is command-t
-- use 'wincent/command-t'
-- Another grep tool (similar to Sublime Text Ctrl+Shift+F)
-- use 'dyng/ctrlsf.vim'
-- A grepping tool
-- use {'mhinz/vim-grepper', cmd = {'Grepper', '<plug>(GrepperOperator)'}}
use { "nvim-telescope/telescope-symbols.nvim", after = "telescope.nvim" }
-- A list of colorscheme plugin you may want to try. Find what suits you.
use({"lifepillar/vim-gruvbox8", opt = true})
use({"navarasu/onedark.nvim", opt = true})
use({"sainnhe/edge", opt = true})
use({"sainnhe/sonokai", opt = true})
use({"sainnhe/gruvbox-material", opt = true})
use({"shaunsingh/nord.nvim", opt = true})
use({"NTBBloodbath/doom-one.nvim", opt = true})
use({"sainnhe/everforest", opt = true})
use({"EdenEast/nightfox.nvim", opt = true})
use { "navarasu/onedark.nvim", opt = true }
use { "sainnhe/edge", opt = true }
use { "sainnhe/sonokai", opt = true }
use { "sainnhe/gruvbox-material", opt = true }
use { "shaunsingh/nord.nvim", opt = true }
use { "sainnhe/everforest", opt = true }
use { "EdenEast/nightfox.nvim", opt = true }
use { "rebelot/kanagawa.nvim", opt = true }
use { "catppuccin/nvim", as = "catppuccin", opt = true }
use({ "rose-pine/neovim", as = 'rose-pine', opt = true })
use { "olimorris/onedarkpro.nvim", opt = true }
use { "tanvirtin/monokai.nvim", opt = true }
use { "marko-cerovac/material.nvim", opt = true }
-- Show git change (change, delete, add) signs in vim sign column
use({"mhinz/vim-signify", event = 'BufEnter'})
-- Another similar plugin
-- use 'airblade/vim-gitgutter'
use { "kyazdani42/nvim-web-devicons", event = "VimEnter" }
-- colorful status line and theme
use({"vim-airline/vim-airline-themes", after = 'vim-signify',})
use({"vim-airline/vim-airline", after = 'vim-airline-themes',})
use {
"nvim-lualine/lualine.nvim",
event = "VimEnter",
cond = firenvim_not_active,
config = [[require('config.statusline')]],
}
use({ "akinsho/bufferline.nvim", event = "VimEnter", config = [[require('config.bufferline')]] })
use { "akinsho/bufferline.nvim", event = "VimEnter",
cond = firenvim_not_active,
config = [[require('config.bufferline')]] }
use { 'goolord/alpha-nvim', config = [[require('config.alpha-nvim')]] }
-- fancy start screen
use({ "lukas-reineke/indent-blankline.nvim", event = "VimEnter", config = [[require('config.indent-blankline')]] })
use { "glepnir/dashboard-nvim", event = "VimEnter",
cond = firenvim_not_active,
config = [[require('config.dashboard-nvim')]]
}
use {
"lukas-reineke/indent-blankline.nvim",
event = "VimEnter",
config = [[require('config.indent-blankline')]],
}
-- Highlight URLs inside vim
use({"itchyny/vim-highlighturl", event = "VimEnter"})
use { "itchyny/vim-highlighturl", event = "VimEnter" }
-- notification plugin
use({ "rcarriga/nvim-notify", event = "BufEnter", config = [[require('config.nvim-notify')]] })
use {
"rcarriga/nvim-notify",
event = "BufEnter",
config = function()
vim.defer_fn(function()
require("config.nvim-notify")
end, 2000)
end,
}
-- For Windows and Mac, we can open an URL in the browser. For Linux, it may
-- not be possible since we maybe in a server which disables GUI.
if vim.g.is_win or vim.g.is_mac then
-- open URL in browser
use({"tyru/open-browser.vim", event = "VimEnter"})
use { "tyru/open-browser.vim", event = "VimEnter" }
end
-- Only install these plugins if ctags are installed on the system
if utils.executable("ctags") then
-- plugin to manage your tags
use({"ludovicchabant/vim-gutentags", event = "VimEnter"})
-- show file tags in vim window
use({"liuchengxu/vista.vim", cmd = "Vista"})
use { "liuchengxu/vista.vim", cmd = "Vista" }
end
-- Snippet engine and snippet template
use({"SirVer/ultisnips", event = 'InsertEnter'})
use({ "honza/vim-snippets", after = 'ultisnips'})
use { "SirVer/ultisnips", event = "InsertEnter" }
use { "honza/vim-snippets", after = "ultisnips" }
-- Automatic insertion and deletion of a pair of characters
use({"Raimondi/delimitMate", event = "InsertEnter"})
use { "Raimondi/delimitMate", event = "InsertEnter" }
-- Comment plugin
use({"tpope/vim-commentary", event = "VimEnter"})
use { "tpope/vim-commentary", event = "VimEnter" }
-- Multiple cursor plugin like Sublime Text?
-- use 'mg979/vim-visual-multi'
-- Autosave files on certain events
use({"Pocco81/AutoSave.nvim", event = "VimEnter", config = [[require('config.autosave')]]})
use { "907th/vim-auto-save", event = "InsertEnter" }
-- Show undo history visually
use({"simnalamburt/vim-mundo", cmd = {"MundoToggle", "MundoShow"}})
use { "simnalamburt/vim-mundo", cmd = { "MundoToggle", "MundoShow" } }
-- Manage your yank history
if vim.g.is_win or vim.g.is_mac then
use({"svermeulen/vim-yoink", event = "VimEnter"})
use { "svermeulen/vim-yoink", event = "VimEnter" }
end
-- Handy unix command inside Vim (Rename, Move etc.)
use({"tpope/vim-eunuch", cmd = {"Rename", "Delete"}})
use { "tpope/vim-eunuch", cmd = { "Rename", "Delete" } }
-- Repeat vim motions
use({"tpope/vim-repeat", event = "VimEnter"})
use { "tpope/vim-repeat", event = "VimEnter" }
-- Show the content of register in preview window
-- Plug 'junegunn/vim-peekaboo'
use({ "jdhao/better-escape.vim", event = { "InsertEnter" } })
use { "nvim-zh/better-escape.vim", event = { "InsertEnter" } }
if vim.g.is_mac then
use({ "lyokha/vim-xkbswitch", event = { "InsertEnter" } })
use { "lyokha/vim-xkbswitch", event = { "InsertEnter" } }
elseif vim.g.is_win then
use({ "Neur1n/neuims", event = { "InsertEnter" } })
use { "Neur1n/neuims", event = { "InsertEnter" } }
end
-- Syntax check and make
-- use 'neomake/neomake'
-- Auto format tools
use({ "sbdchd/neoformat", cmd = { "Neoformat" } })
-- use 'Chiel92/vim-autoformat'
use { "sbdchd/neoformat", cmd = { "Neoformat" } }
-- Git command inside vim
use({ "tpope/vim-fugitive", event = "User InGitRepo" })
use { "tpope/vim-fugitive", event = "User InGitRepo", config = [[require('config.fugitive')]] }
-- Better git log display
use({ "rbong/vim-flog", requires = "tpope/vim-fugitive", cmd = { "Flog" } })
use { "rbong/vim-flog", requires = "tpope/vim-fugitive", cmd = { "Flog" } }
use({ "kevinhwang91/nvim-bqf", event = "FileType qf", config = [[require('config.bqf')]] })
use { "christoomey/vim-conflicted", requires = "tpope/vim-fugitive", cmd = { "Conflicted" } }
use {
"ruifm/gitlinker.nvim",
requires = "nvim-lua/plenary.nvim",
event = "User InGitRepo",
config = [[require('config.git-linker')]],
}
-- Show git change (change, delete, add) signs in vim sign column
use { "lewis6991/gitsigns.nvim", config = [[require('config.gitsigns')]] }
-- Better git commit experience
use({"rhysd/committia.vim", opt = true, setup = [[vim.cmd('packadd committia.vim')]]})
use { "rhysd/committia.vim", opt = true, setup = [[vim.cmd('packadd committia.vim')]] }
use { "kevinhwang91/nvim-bqf", ft = "qf", config = [[require('config.bqf')]] }
-- Another markdown plugin
use({ "plasticboy/vim-markdown", ft = { "markdown" } })
use { "preservim/vim-markdown", ft = { "markdown" } }
-- Faster footnote generation
use({ "vim-pandoc/vim-markdownfootnotes", ft = { "markdown" } })
use { "vim-pandoc/vim-markdownfootnotes", ft = { "markdown" } }
-- Vim tabular plugin for manipulate tabular, required by markdown plugins
use({ "godlygeek/tabular", cmd = { "Tabularize" } })
-- Markdown JSON header highlight plugin
use({ "elzr/vim-json", ft = { "json", "markdown" } })
use { "godlygeek/tabular", cmd = { "Tabularize" } }
-- Markdown previewing (only for Mac and Windows)
if vim.g.is_win or vim.g.is_mac then
use({
use {
"iamcco/markdown-preview.nvim",
run = function()
fn["mkdp#util#install"]()
end,
run = "cd app && npm install",
ft = { "markdown" },
})
}
end
use({'folke/zen-mode.nvim', cmd = 'ZenMode', config = [[require('config.zen-mode')]]})
use { "folke/zen-mode.nvim", cmd = "ZenMode", config = [[require('config.zen-mode')]] }
if vim.g.is_mac then
use({ "rhysd/vim-grammarous", ft = { "markdown" } })
use { "rhysd/vim-grammarous", ft = { "markdown" } }
end
use({"chrisbra/unicode.vim", event = "VimEnter"})
use { "chrisbra/unicode.vim", event = "VimEnter" }
-- Additional powerful text object for vim, this plugin should be studied
-- carefully to use its full power
use({"wellle/targets.vim", event = "VimEnter"})
use { "wellle/targets.vim", event = "VimEnter" }
-- Plugin to manipulate character pairs quickly
-- use 'tpope/vim-surround'
use({"machakann/vim-sandwich", event = "VimEnter"})
use { "machakann/vim-sandwich", event = "VimEnter" }
-- Add indent object for vim (useful for languages like Python)
use({"michaeljsmith/vim-indent-object", event = "VimEnter"})
use { "michaeljsmith/vim-indent-object", event = "VimEnter" }
-- Only use these plugin on Windows and Mac and when LaTeX is installed
if vim.g.is_win or vim.g.is_mac and utils.executable("latex") then
use({ "lervag/vimtex", ft = { "tex" } })
-- use {'matze/vim-tex-fold', ft = {'tex', }}
-- use 'Konfekt/FastFold'
if utils.executable("latex") then
use { "lervag/vimtex", ft = { "tex" } }
end
-- Since tmux is only available on Linux and Mac, we only enable these plugins
-- for Linux and Mac
if utils.executable("tmux") then
-- .tmux.conf syntax highlighting and setting check
use({ "tmux-plugins/vim-tmux", ft = { "tmux" } })
use { "tmux-plugins/vim-tmux", ft = { "tmux" } }
end
-- Modern matchit implementation
use({"andymass/vim-matchup", event = "VimEnter"})
use { "andymass/vim-matchup", event = "VimEnter" }
-- Smoothie motions
-- use 'psliwka/vim-smoothie'
use({ "karb94/neoscroll.nvim", event = "VimEnter", config = [[require('config.neoscroll')]] })
use({"tpope/vim-scriptease", cmd = {"Scriptnames", "Message", "Verbose"}})
use { "tpope/vim-scriptease", cmd = { "Scriptnames", "Message", "Verbose" } }
-- Asynchronous command execution
use({ "skywind3000/asyncrun.vim", opt = true, cmd = { "AsyncRun" } })
-- Another asynchronous plugin
-- Plug 'tpope/vim-dispatch'
use { "skywind3000/asyncrun.vim", opt = true, cmd = { "AsyncRun" } }
use({ "cespare/vim-toml", ft = { "toml" }, branch = "main" })
use { "cespare/vim-toml", ft = { "toml" }, branch = "main" }
-- Edit text area in browser using nvim
if vim.g.is_win or vim.g.is_mac then
use({
use {
"glacambre/firenvim",
run = function() fn["firenvim#install"](0) end,
run = function()
fn["firenvim#install"](0)
end,
opt = true,
setup = [[vim.cmd('packadd firenvim')]],
})
}
end
-- Debugger plugin
if vim.g.is_win or vim.g.is_linux then
use({ "sakhnik/nvim-gdb", run = { "bash install.sh" }, opt = true, setup = [[vim.cmd('packadd nvim-gdb')]] })
use { "sakhnik/nvim-gdb", run = { "bash install.sh" }, opt = true, setup = [[vim.cmd('packadd nvim-gdb')]] }
end
-- Session management plugin
use({"tpope/vim-obsession", cmd = 'Obsession'})
use { "tpope/vim-obsession", cmd = "Obsession" }
if vim.g.is_linux then
use({"ojroques/vim-oscyank", cmd = {'OSCYank', 'OSCYankReg'}})
use { "ojroques/vim-oscyank", cmd = { "OSCYank", "OSCYankReg" } }
end
-- The missing auto-completion for cmdline!
use({"gelguy/wilder.nvim", opt = true, setup = [[vim.cmd('packadd wilder.nvim')]]})
use { "gelguy/wilder.nvim", opt = true, setup = [[vim.cmd('packadd wilder.nvim')]] }
-- showing keybindings
use {"folke/which-key.nvim", event = "VimEnter", config = [[require('config.which-key')]]}
use {
"folke/which-key.nvim",
event = "VimEnter",
config = function()
vim.defer_fn(function()
require("config.which-key")
end, 2000)
end,
}
-- show and trim trailing whitespaces
use {'jdhao/whitespace.nvim', event = 'VimEnter'}
use { "jdhao/whitespace.nvim", event = "VimEnter" }
-- file explorer
use {
"kyazdani42/nvim-tree.lua",
requires = { "kyazdani42/nvim-web-devicons" },
config = [[require('config.nvim-tree')]],
}
use { "ii14/emmylua-nvim", ft = "lua" }
use { "j-hui/fidget.nvim", after = "nvim-lspconfig", config = [[require('config.fidget-nvim')]] }
end,
config = {
max_jobs = 16,
git = {
default_url_format = plug_url_format,
},
compile_path = packer_util.join_paths(fn.stdpath("data"), "site", "lua", "packer_compiled.lua"),
},
}
-- For fresh install, we need to install plugins. Otherwise, we just need to require `packer_compiled.lua`.
if fresh_install then
-- We run packer.sync() here, because only after packer.startup, can we know which plugins to install.
-- So plugin installation should be done after the startup process.
packer.sync()
else
local status, _ = pcall(require, "packer_compiled")
if not status then
local msg = "File packer_compiled.lua not found: run PackerSync to fix!"
vim.notify(msg, vim.log.levels.ERROR, { title = "nvim-config" })
end
end
-- Auto-generate packer_compiled.lua file
api.nvim_create_autocmd({ "BufWritePost" }, {
pattern = "*/nvim/lua/plugins.lua",
group = api.nvim_create_augroup("packer_auto_compile", { clear = true }),
callback = function(ctx)
local cmd = "source " .. ctx.file
vim.cmd(cmd)
vim.cmd("PackerCompile")
vim.notify("PackerCompile done!", vim.log.levels.INFO, { title = "Nvim-config" })
end,
})

View File

@@ -1,17 +1,66 @@
-- inspect something
-- Taken from https://github.com/jamestthompson3/vimConfig/blob/eeef4a8eeb5a24938f8a0969a35f69c78643fb66/lua/tt/nvim_utils.lua#L106
function inspect(item)
print(vim.inspect(item))
end
local fn = vim.fn
local M = {}
function M.executable(name)
if vim.fn.executable(name) > 0 then
if fn.executable(name) > 0 then
return true
end
return false
end
--- check whether a feature exists in Nvim
--- @feat: string
--- the feature name, like `nvim-0.7` or `unix`.
--- return: bool
M.has = function(feat)
if fn.has(feat) == 1 then
return true
end
return false
end
--- Create a dir if it does not exist
function M.may_create_dir(dir)
local res = fn.isdirectory(dir)
if res == 0 then
fn.mkdir(dir, "p")
end
end
function M.get_nvim_version()
local actual_ver = vim.version()
local nvim_ver_str = string.format("%d.%d.%d", actual_ver.major, actual_ver.minor, actual_ver.patch)
return nvim_ver_str
end
--- Generate random integers in the range [Low, High], inclusive,
--- adapted from https://stackoverflow.com/a/12739441/6064933
--- @low: the lower value for this range
--- @high: the upper value for this range
function M.rand_int(low, high)
-- Use lua to generate random int, see also: https://stackoverflow.com/a/20157671/6064933
math.randomseed(os.time())
return math.random(low, high)
end
--- Select a random element from a sequence/list.
--- @seq: the sequence to choose an element
function M.rand_element(seq)
local idx = M.rand_int(1, #seq)
return seq[idx]
end
function M.add_pack(name)
local status, error = pcall(vim.cmd, "packadd " .. name)
return status
end
return M

View File

@@ -8,6 +8,7 @@ snippet bare "barebone code template"
#include <unordered_set>
#include <stack>
#include <queue>
#include <numeric>
using std::cout;
using std::endl;
@@ -23,6 +24,7 @@ using std::pair;
using std::make_pair;
int main()
{
@@ -41,8 +43,9 @@ void printList(const T& arr, const string& desc){
std::cout << desc << ": [";
for (auto it = arr.begin(); it != arr.end(); it++){
std::cout << *it << ((std::next(it) != arr.end()) ? ", " : "]\n");
std::cout << *it << ((std::next(it) != arr.end()) ? ", " : "");
}
std::cout << "]\n";
}
endsnippet
@@ -53,13 +56,25 @@ void printMat(const vector<vector<T>>& mat, const string& desc){
for (auto it1 = mat.begin(); it1 != mat.end(); it1++){
auto cur_vec = *it1;
cout << "[";
for (auto it2 = cur_vec.begin(); it2 != cur_vec.end(); it2++){
cout << *it2 << ((std::next(it2) != cur_vec.end()) ? ", " : "\n");
cout << *it2 << ((std::next(it2) != cur_vec.end()) ? ", " : "]\n");
}
}
}
endsnippet
snippet pqueue "print queue"
template <class T>
void printQueue(T q){
while(!q.empty()){
std::cout << q.top() << " ";
q.pop();
}
std::cout << '\n';
}
endsnippet
snippet cout "print a variable" w
cout << "$1: " << $2 << endl;
endsnippet

View File

@@ -23,7 +23,7 @@ snippet k3 "Three key strokes shortcut"
<kbd>${1:KEY}</kbd> + <kbd>${2:KEY}</kbd> + <kbd>${3:KEY}</kbd>
endsnippet
snippet "meta" "Markdown front matter (YAML format)" b
snippet meta "Markdown front matter (YAML format)" b
---
title: "$1"
date: `!p from datetime import datetime
@@ -47,7 +47,7 @@ $0
endsnippet
snippet font "HTML font tag"
<font color="${1:red}">${2:TEXT}</font>
<font color="${1:blue}">${2:TEXT}</font>
endsnippet
snippet link "Markdown links"
@@ -70,3 +70,99 @@ endsnippet
snippet yh "直角引号" w
「$1」
endsnippet
snippet info "info box"
<style type="text/css">
@import url('//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css');
.info-msg {
color: #059;
background-color: #BEF;
margin: 5px 0;
margin-bottom: 20px;
padding: 10px;
border-radius: 5px 5px 5px 5px;
border: 2px solid transparent;
border-color: transparent;
}
</style>
<div class="info-msg">
<i class="fa fa-info-circle"> Info</i></br>
${1:info text}
</div>
$0
endsnippet
snippet warn "warning box"
<style type="text/css">
@import url('//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css');
.warning-msg {
color: #9F6000;
background-color: #FEEFB3;
margin: 5px 0;
margin-bottom: 20px;
padding: 10px;
border-radius: 5px 5px 5px 5px;
border: 2px solid transparent;
border-color: transparent;
}
</style>
<div class="warning-msg">
<i class="fa fa-warning"> Warning</i></br>
${1:warning text}
</div>
$0
endsnippet
snippet error "error box"
<style type="text/css">
@import url('//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css');
.error-msg {
color: #D8000C;
background-color: #FFBABA;
margin: 5px 0;
margin-bottom: 20px;
padding: 10px;
border-radius: 5px 5px 5px 5px;
border: 2px solid transparent;
border-color: transparent;
}
</style>
<div class="error-msg">
<i class="fa fa-times-circle"> Error</i></br>
${1:error text}
</div>
$0
endsnippet
snippet success "success box"
<style type="text/css">
@import url('//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css');
.success-msg {
color: #270;
background-color: #DFF2BF;
margin: 5px 0;
margin-bottom: 20px;
padding: 10px;
border-radius: 5px 5px 5px 5px;
border: 2px solid transparent;
border-color: transparent;
}
</style>
<div class="success-msg">
<i class="fa fa-check"></i>
${1:success text}
</div>
$0
endsnippet
snippet td "too long do not read" bw
tl;dr: $1
endsnippet

View File

@@ -24,3 +24,7 @@ def main():
if __name__ == "__main__":
main()
endsnippet
snippet sol "solution" b
solution = Solution()
endsnippet

View File

@@ -0,0 +1,6 @@
# copied from https://github.com/honza/vim-snippets/blob/master/UltiSnips/snippets.snippets
snippet snip "Ultisnips snippet definition" b
`!p snip.rv = "snippet"` ${1:Tab_trigger} "${2:Description}" ${3:b}
${0:${VISUAL}}
`!p snip.rv = "endsnippet"`
endsnippet

View File

@@ -1,3 +1,9 @@
snippet frac "Math fractions"
\frac{${1:NUM}}{${2:DEN}} $0
snippet use "usepackage" b
\usepackage{${1:package}}
endsnippet
snippet eqa "equation environment" b
\begin{equation}\label{$1}
$2
\end{equation}
endsnippet

2
plugin/abbrev.vim Normal file
View File

@@ -0,0 +1,2 @@
" some abbreviations
iabbrev reqire require

View File

@@ -3,3 +3,45 @@ command! -nargs=1 -complete=command Redir call utils#CaptureCommandOutput(<q-arg
command! -bar -bang -nargs=+ -complete=file Edit call utils#MultiEdit([<f-args>])
call utils#Cabbrev('edit', 'Edit')
call utils#Cabbrev('man', 'Man')
" show current date and time in human readable format
command! -nargs=? Datetime echo utils#iso_time(<q-args>)
" Convert Markdown file to PDF
command! ToPDF call s:md_to_pdf()
function! s:md_to_pdf() abort
" check if pandoc is installed
if executable('pandoc') != 1
echoerr "pandoc not found"
return
endif
let l:md_path = expand("%:p")
let l:pdf_path = fnamemodify(l:md_path, ":r") .. ".pdf"
let l:header_path = stdpath('config') . '/resources/head.tex'
let l:cmd = "pandoc --pdf-engine=xelatex --highlight-style=zenburn --table-of-content " .
\ "--include-in-header=" . l:header_path . " -V fontsize=10pt -V colorlinks -V toccolor=NavyBlue " .
\ "-V linkcolor=red -V urlcolor=teal -V filecolor=magenta -s " .
\ l:md_path . " -o " . l:pdf_path
if g:is_mac
let l:cmd = l:cmd . '&& open ' . l:pdf_path
endif
if g:is_win
let l:cmd = l:cmd . '&& start ' . l:pdf_path
endif
" echomsg l:cmd
let l:id = jobstart(l:cmd)
if l:id == 0 || l:id == -1
echoerr "Error running command"
endif
endfunction

119
plugin/log-autocmds.vim Normal file
View File

@@ -0,0 +1,119 @@
command! LogAutocmds call s:log_autocmds_toggle()
function! s:log_autocmds_toggle()
augroup LogAutocmd
autocmd!
augroup END
let l:date = strftime('%F', localtime())
let s:activate = get(s:, 'activate', 0) ? 0 : 1
if !s:activate
call s:log('Stopped autocmd log (' . l:date . ')')
return
endif
call s:log('Started autocmd log (' . l:date . ')')
augroup LogAutocmd
for l:au in s:aulist
silent execute 'autocmd' l:au '* call s:log(''' . l:au . ''')'
endfor
augroup END
endfunction
function! s:log(message)
silent execute '!echo "'
\ . strftime('%T', localtime()) . ' - ' . a:message . '"'
\ '>> /tmp/vim_log_autocommands'
endfunction
" These are deliberately left out due to side effects
" - SourceCmd
" - FileAppendCmd
" - FileWriteCmd
" - BufWriteCmd
" - FileReadCmd
" - BufReadCmd
" - FuncUndefined
let s:aulist = [
\ 'BufNewFile',
\ 'BufReadPre',
\ 'BufRead',
\ 'BufReadPost',
\ 'FileReadPre',
\ 'FileReadPost',
\ 'FilterReadPre',
\ 'FilterReadPost',
\ 'StdinReadPre',
\ 'StdinReadPost',
\ 'BufWrite',
\ 'BufWritePre',
\ 'BufWritePost',
\ 'FileWritePre',
\ 'FileWritePost',
\ 'FileAppendPre',
\ 'FileAppendPost',
\ 'FilterWritePre',
\ 'FilterWritePost',
\ 'BufAdd',
\ 'BufCreate',
\ 'BufDelete',
\ 'BufWipeout',
\ 'BufFilePre',
\ 'BufFilePost',
\ 'BufEnter',
\ 'BufLeave',
\ 'BufWinEnter',
\ 'BufWinLeave',
\ 'BufUnload',
\ 'BufHidden',
\ 'BufNew',
\ 'SwapExists',
\ 'FileType',
\ 'Syntax',
\ 'EncodingChanged',
\ 'TermChanged',
\ 'VimEnter',
\ 'GUIEnter',
\ 'GUIFailed',
\ 'TermResponse',
\ 'QuitPre',
\ 'VimLeavePre',
\ 'VimLeave',
\ 'FileChangedShell',
\ 'FileChangedShellPost',
\ 'FileChangedRO',
\ 'ShellCmdPost',
\ 'ShellFilterPost',
\ 'CmdUndefined',
\ 'SpellFileMissing',
\ 'SourcePre',
\ 'VimResized',
\ 'FocusGained',
\ 'FocusLost',
\ 'CursorHold',
\ 'CursorHoldI',
\ 'CursorMoved',
\ 'CursorMovedI',
\ 'WinEnter',
\ 'WinLeave',
\ 'TabEnter',
\ 'TabLeave',
\ 'CmdwinEnter',
\ 'CmdwinLeave',
\ 'InsertEnter',
\ 'InsertChange',
\ 'InsertLeave',
\ 'InsertCharPre',
\ 'TextChanged',
\ 'TextChangedI',
\ 'ColorScheme',
\ 'RemoteReply',
\ 'QuickFixCmdPre',
\ 'QuickFixCmdPost',
\ 'SessionLoadPost',
\ 'MenuPopup',
\ 'CompleteDone',
\ 'User',
\ ]

78
resources/head.tex Normal file
View File

@@ -0,0 +1,78 @@
\usepackage{fancyvrb,newverbs}
\usepackage[top=2cm, bottom=1.5cm, left=2cm, right=2cm]{geometry}
\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor}
\usepackage{hyperref}
% begin a new page for each section (first level header),
% we need to combine this with `-V subparagraph` when invoking pandc
% \usepackage{titlesec}
% \newcommand{\sectionbreak}{\clearpage}
% change background color for inline code in markdown files.
% The following code does not work well for long text, because the text will exceed the page boundary.
\definecolor{bgcolor}{HTML}{DADADA}
\let\oldtexttt\texttt
\renewcommand{\texttt}[1]{
\colorbox{bgcolor}{\oldtexttt{#1}}
}
% change style of quote, see also https://tex.stackexchange.com/a/436253/114857
\usepackage[most]{tcolorbox}
\definecolor{linequote}{RGB}{224,215,188}
\definecolor{backquote}{RGB}{249,245,233}
\definecolor{bordercolor}{RGB}{221,221,221}
% change left border: https://tex.stackexchange.com/a/475716/114857
% change left margin: https://tex.stackexchange.com/a/457936/114857
\newtcolorbox{myquote}[1][]{%
enhanced,
breakable,
size=minimal,
left=10pt,
top=5pt,
bottom=5pt,
frame hidden,
boxrule=0pt,
sharp corners=all,
colback=backquote,
borderline west={2pt}{0pt}{bordercolor},
#1
}
% redefine quote environment to use the myquote environment, see https://tex.stackexchange.com/a/337587/114857
\renewenvironment{quote}{\begin{myquote}}{\end{myquote}}
% start a new page after toc, we need to save the old command before defining
% new one to avoid recursive command calls,
% see https://tex.stackexchange.com/questions/47351/can-i-redefine-a-command-to-contain-itself
\let\oldtoc\tableofcontents
\renewcommand{\tableofcontents}{\oldtoc\newpage}
% fix header level issue
\usepackage{enumitem}
\setlistdepth{9}
\setlist[itemize,1]{label=$\bullet$}
\setlist[itemize,2]{label=$\bullet$}
\setlist[itemize,3]{label=$\bullet$}
\setlist[itemize,4]{label=$\bullet$}
\setlist[itemize,5]{label=$\bullet$}
\setlist[itemize,6]{label=$\bullet$}
\setlist[itemize,7]{label=$\bullet$}
\setlist[itemize,8]{label=$\bullet$}
\setlist[itemize,9]{label=$\bullet$}
\renewlist{itemize}{itemize}{9}
\setlist[enumerate,1]{label=$\arabic*.$}
\setlist[enumerate,2]{label=$\alph*.$}
\setlist[enumerate,3]{label=$\roman*.$}
\setlist[enumerate,4]{label=$\arabic*.$}
\setlist[enumerate,5]{label=$\alpha*$}
\setlist[enumerate,6]{label=$\roman*.$}
\setlist[enumerate,7]{label=$\arabic*.$}
\setlist[enumerate,8]{label=$\alph*.$}
\setlist[enumerate,9]{label=$\roman*.$}
\renewlist{enumerate}{enumerate}{9}

View File

@@ -194,7 +194,6 @@ wiki
backticks
Reddit
LeaderF
gruvbox8
tabpage
ccls
cmake
@@ -203,6 +202,8 @@ llvm
subsampling
refactor
colorschemes
gruvbox8
gruvbox
Gruvbox
monokai
NeoSolarized
@@ -323,3 +324,132 @@ zshrc
pdftoppm
pdf2image
pdffonts
myers
difftool
vimdiff
softmax
lib64
toolset
sym
ffmpeg
PyAV
mp4
vint
npm
js
sudo
ps1
tpm
hacky
PCRE
teardown
github
fastgit
EOL
PyCharm
deduplication
STL
delimitMate
lspconfig
lualine
Keymap
iCloud
keyframe
maskRCNN
vundle
ycm
ftplugin
vim9
dotfile
magit
xelatex
subarray
fvim
CUDA
cuda
cpu
jdhao
whitelisted
BST
autocmd
init
miniconda
tsinghua
pylsp
mypy
isort
ustc
PyTorch
maxcdn
torchvision
FFmpeg
pyav
wezterm
frac
argmax
NeruIPS
InfoNCE
LSTM
linkedin
hotmail
datetime
csv
iterable
dataframe
CRNN
ICPR
matplotlib
scikit
NumPy
cudnn
SGD
ImageNet
ReLU
CIFAR
ResNet
XGBoost
Shenzhen
Tanh
Kaggle
minist
src
RGBA
yapf
Vimming
overfitting
PCA
SVM
KNN
leetcode
Logitech
WTF
tensorboard
Nvidia
GPG
manpage
metatable
open3d
pyntcloud
param
reddit
viml
PostgreSQL
CNY
wechat
ziroom
Postgres
plpgsql
postgres
PySpark
winbar
cmdline
shada
async
localhost
JetBrains
localhost
MariaDB
SQLite
Pgadmin
Datagrip
mysql