summaryrefslogtreecommitdiff
path: root/ftplugin/hackernews.vim
blob: 7b0bed490d64feca495e119f74b23a309cfc0395 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
"  vim-hackernews
"  --------------
"  Browse Hacker News (news.ycombinator.com) inside Vim.
"
"  Author:  ryanss <ryanssdev@icloud.com>
"  Website: https://github.com/ryanss/vim-hackernews
"  License: MIT (see LICENSE file)
"  Version: 0.1.1


if has('python')
    command! -nargs=1 Python python <args>
elseif has('python3')
    command! -nargs=1 Python python3 <args>
else
    echo "HackerNews.vim Error: Requires Vim compiled with +python or +python3"
    finish
endif

if !exists("g:hackernews_marks")
    let g:hackernews_marks = {}
endif


" Import Python code
execute "Python import sys"
execute "Python sys.path.append(r'" . expand("<sfile>:p:h") . "')"

Python << EOF
if 'hackernews' not in sys.modules:
    import hackernews
else:
    # Reload python module to avoid errors when updating plugin
    hackernews = reload(hackernews)
EOF


" Load front page
execute "Python hackernews.main()"


noremap <buffer> o :Python hackernews.link()<cr>
noremap <buffer> O :Python hackernews.link(external=True)<cr>
noremap <buffer> gx :Python hackernews.link(external=True)<cr>
noremap <buffer> u u:Python hackernews.recall_pos()<cr>
noremap <buffer> <C-r> <C-r>:Python hackernews.recall_pos()<cr>


" Helper motions to browse front page, comments and articles easier
function! s:Move(backwards)
    let dir = a:backwards? '?' : '/'
    if match(getline(1), "┌───┐") == 0
        " Front Page
        if match(getline('.'), '^\s\{4}.\+ago') >= 0
            " Move to next/previous comment line
            let pattern = '^\s\{4}[0-9]'
        else
            " Move to next/previous title line
            let pattern = '^\s*\d\+\.\s.'
        endif
        execute 'silent normal! ' . dir . pattern . dir . 'e\r'
    elseif match(getline(2), '^\d\+\s.\+ago') == 0
        " Comment Page
        let pattern = '^\s*Comment by'
        execute 'silent normal! ' . dir . pattern . dir . '\rzt'
    else
        " Article
        if a:backwards
            silent normal! {
        else
            silent normal! }
        endif
    endif
endfunction

noremap <buffer> J :call <SID>Move(0)<cr>
noremap <buffer> K :call <SID>Move(1)<cr>