예제 #1
0
 def view_mime(self):
     Vim.command('setlocal buftype=nofile')
     Vim.command('setlocal noswapfile')
     Vim.command('setlocal nobuflisted')
     Vim.command('setlocal bufhidden=wipe')
     Vim.current.buffer[:] = [self.path, self.mime_type]
     Vim.command('setlocal nomodifiable')
예제 #2
0
파일: ui.py 프로젝트: xbl3/vim-netranger
    def _set(self, mark):
        """ The callback for the BookMarkUI/set. """
        if mark == '':
            return
        if mark not in self.valid_mark:
            Vim.command('echo "Only a-zA-Z are valid mark!!"')
            return
        set_buf = self.bufs['set']
        set_buf.options['modifiable'] = True

        if mark in self.mark_dict:
            for i, line in enumerate(set_buf):
                if len(line) > 0 and line[0] == mark:
                    set_buf[i] = f'{mark}:{self.path_to_mark}'
                    break
        elif self.path_to_mark in self.mark_dict.values():
            for i, line in enumerate(set_buf):
                if len(line) > 0 and line[2:] == self.path_to_mark:
                    set_buf[i] = f'{mark}:{self.path_to_mark}'
                    break
        else:
            set_buf.append(f'{mark}:{self.path_to_mark}')
        set_buf.options['modifiable'] = False
        self.mark_dict[mark] = self.path_to_mark
        self.del_buf('go')
        with open(Vim.Var('NETRBookmarkFile'), 'w') as f:
            for k, p in self.mark_dict.items():
                f.write(f'{k}:{p}\n')
예제 #3
0
파일: ui.py 프로젝트: xbl3/vim-netranger
 def load_bookmarks(self):
     self.mark_dict = {}
     if os.path.isfile(Vim.Var('NETRBookmarkFile')):
         with open(Vim.Var('NETRBookmarkFile'), 'r') as f:
             for line in f:
                 kp = line.split(':')
                 if (len(kp) == 2):
                     self.mark_dict[kp[0].strip()] = kp[1].strip()
예제 #4
0
    def map_key_reg(self, key, regval):
        """ Register a key mapping in a UI buffer.
        The mapped action is:
        1. Store regval into g:NETRRegister, which serves as the argument for
        netranger buffer's call back after UI buffer quit.
        2. Quit the UI buffer.

        See Netranger.pend_onuiquit for details.
        """
        Vim.command(f'nnoremap <nowait> <silent> <buffer> {key} '
                    f':let g:NETRRegister=["{regval}"] <cr> :quit <cr>')
예제 #5
0
파일: fs.py 프로젝트: ipod825/vim-netranger
    def init(self, root_dir, remote_remap):
        self._flags = Vim.Var("_NETRRcloneFlags", default="")
        self.rclone_rcd_port = Vim.Var('NETRcloneRcdPort')
        if root_dir[-1] == '/':
            root_dir = root_dir[:-1]

        self.root_dir = root_dir
        self.rplen = len(root_dir) + 1
        self.rcd_started = False
        for remote, root in remote_remap.items():
            if root[-1] != '/':
                remote_remap[remote] += '/'
        self.remote_remap = remote_remap
        Shell.mkdir(root_dir)
예제 #6
0
파일: ui.py 프로젝트: xbl3/vim-netranger
    def __init__(self, netranger):
        UI.__init__(self)
        self.valid_mark = string.ascii_lowercase + string.ascii_uppercase
        self.netranger = netranger
        self.mark_dict = {}
        self.path_to_mark = None

        # This is to avoid a bug that I can't solve.
        # If bookmark file is initially empty. The first time
        # 'm' (set) mapping is trigger, it won't quit the buffer
        # on user input..
        if not os.path.isfile(Vim.Var('NETRBookmarkFile')):
            with open(Vim.Var('NETRBookmarkFile'), 'w') as f:
                f.write(f'~:{os.path.expanduser("~")}')

        self.load_bookmarks()
예제 #7
0
파일: fs.py 프로젝트: ipod825/vim-netranger
    def list_remotes_in_vim_buffer(self):
        if not Shell.isinPATH('rclone'):
            self.install_rclone()

        remotes = set(self.cmd_listremotes())
        local_remotes = set(super(Rclone, self).ls(self.root_dir))
        for remote in remotes.difference(local_remotes):
            Shell.mkdir(os.path.join(self.root_dir, remote))
        for remote in local_remotes.difference(remotes):
            Shell.rm(os.path.join(self.root_dir, remote))

        if len(remotes) > 0:
            Vim.command(f'NETRTabdrop {self.root_dir}')
        else:
            Vim.ErrorMsg(
                "There's no remote now. Run 'rclone config' in a terminal to "
                "setup remotes and restart vim again.")
예제 #8
0
파일: fs.py 프로젝트: ipod825/vim-netranger
 def __init__(self, target_path=''):
     """ This is a help class for separating local files and remote files
     for mv, cp, rm commands. Though the logic in this class can be done
     in the caller side, it makes the caller has higher branch number and
     hard-to-read code.
     """
     self.remote_targets = []
     self.local_targets = []
     self.remote_root = Vim.Var('NETRemoteCacheDir')
     self.is_remote = self.is_remote_path(target_path)
예제 #9
0
파일: fs.py 프로젝트: ipod825/vim-netranger
    def exec_server_cmd(self, cmd, on_exit, arguments, sudo=False):
        def on_stderr(job_id, err_msg):
            ind = err_msg.rfind('FSServerException: ')
            if ind > 0:
                err_msg = err_msg[ind + 19:]
            Vim.ErrorMsg(err_msg)

        fname = tempfile.mkstemp()[1]
        with open(fname, 'ab') as f:
            pickle.dump(arguments, f)

        if sudo:
            Vim.AsyncRun('sudo {} {} {}'.format(self.ServerCmd, cmd, fname),
                         on_exit=on_exit,
                         term=True)
        else:
            Vim.AsyncRun('{} {} {}'.format(self.ServerCmd, cmd, fname),
                         on_stderr=on_stderr,
                         on_exit=on_exit)
예제 #10
0
    def run_async(cls, cmd, on_stdout=None, on_exit=None):
        def print_error(job_id, err_msg):
            # Truncate unnecessary message if from fs_server.py
            ind = err_msg.rfind('FSServerException: ')
            if ind > 0:
                err_msg = err_msg[ind + 19:]
            Vim.ErrorMsg(err_msg)

        Vim.AsyncRun(cmd,
                     on_stdout=on_stdout,
                     on_exit=on_exit,
                     on_stderr=print_error)
예제 #11
0
 def view_image(self):
     try:
         import ueberzug
     except ModuleNotFoundError:
         Vim.ErrorMsg('Please install ueberzug for image preview')
         self.view_mime()
         return
     path = self.path
     if self.path.endswith('gif') and Shell.isinPATH('convert'):
         if self.path not in self.tempfile_cache:
             dir = tempfile.TemporaryDirectory().name
             Shell.mkdir(dir)
             self.tempfile_cache[self.path] = dir
         dir = self.tempfile_cache[self.path]
         path = dir
         Shell.run(f'convert -deconstruct  "{self.path}" {dir}/a.png')
     Vim.AsyncRun(f'{util.GenNetRangerScriptCmd("image_preview")}\
                     "{path}" {self.total_width} {self.preview_width}',
                  term=True,
                  termopencmd='')
     Vim.command('setlocal nocursorline')
예제 #12
0
파일: fs.py 프로젝트: ipod825/vim-netranger
    def run_cmd(self, cmd):
        if not self.rcd_started:
            Vim.AsyncRun(
                f'rclone {self._flags} rcd --rc-no-auth --rc-addr=localhost:{self.rclone_rcd_port}'
            )
            self.rcd_started = True
            # Ensure the server running before executing the next command.
            time.sleep(.1)

        return json.loads(
            Shell.run(
                f'rclone {self._flags} rc --rc-addr=localhost:{self.rclone_rcd_port} {cmd}'
            ))
예제 #13
0
파일: ui.py 프로젝트: xbl3/vim-netranger
 def edit(self):
     """ Show the buffer for editing the bookmark. """
     Vim.command(f'belowright split {Vim.Var("NETRBookmarkFile")}')
     Vim.command('wincmd J')
     Vim.command('setlocal bufhidden=wipe')
     self.del_buf('set')
     self.del_buf('go')
     self.netranger.pend_onuiquit(self.load_bookmarks)
예제 #14
0
파일: fs.py 프로젝트: ipod825/vim-netranger
    def install_rclone(self):
        import platform
        import zipfile

        rclone_dir = Vim.UserInput(
            'Rclone not in PATH. Install it at (modify/enter)',
            os.path.expanduser('~/rclone'))
        Shell.mkdir(rclone_dir)

        system = platform.system().lower()
        processor = 'amd64'
        if '386' in platform.processor():
            processor = '386'
        else:
            # Should support arm??
            pass

        url = f'https://downloads.rclone.org/rclone-current-{system}-{processor}.zip'
        zip_fname = os.path.join(rclone_dir, 'rclone.zip')
        Shell.urldownload(url, zip_fname)
        zip_ref = zipfile.ZipFile(zip_fname, 'r')
        zip_ref.extractall(rclone_dir)
        for entry in zip_ref.NameToInfo:
            if entry.endswith('rclone'):
                Shell.cp(os.path.join(rclone_dir, entry), rclone_dir)
                Shell.chmod(os.path.join(rclone_dir, 'rclone'), 755)

        zip_ref.close()
        os.remove(zip_fname)

        shellrc = Vim.UserInput(
            'Update PATH in (leave blank to set manually later)',
            Shell.shellrc())
        if len(shellrc) > 0:
            with open(shellrc, 'a') as f:
                f.write(f'PATH={rclone_dir}:$PATH\n')
        os.environ['PATH'] += ':' + rclone_dir
예제 #15
0
    def ask(self, content, fullpath):
        self.show()
        if len(content) > 24:
            Vim.WarningMsg('Ask only supports up to 24 commands.')
            content = content[:24]

        ind = 97
        self.options = content[:]
        self.options.append('vim')
        self.fullpath = fullpath
        for i, c in enumerate(content):
            content[i] = f'{chr(ind)}. {c}'
            ind += 1
        content.append(f'{chr(ind)}. vim')

        buf = self.bufs['default']
        buf.options['modifiable'] = True
        buf[:] = content
        buf.options['modifiable'] = False
        self.netranger.pend_onuiquit(self._ask, num_args=1)
예제 #16
0
    def create_buf(self, content, mappings=None, name='default', map_cr=False):
        """ Create the UI buffer. """
        Vim.command(f'{self.position} new')
        self.set_buf_common_option()
        new_buf = Vim.current.buffer
        self.bufs[name] = new_buf

        if mappings is not None:
            for k, v in mappings:
                self.map_key_reg(k, v)

        if map_cr:
            assert mappings is not None
            ui_internal_vim_dict_name = f'g:_{type(self).__name__}Map'
            Vim.command(f'let {ui_internal_vim_dict_name}={dict(mappings)}')
            Vim.command(
                "nnoremap <nowait> <silent> <buffer> <Cr> "
                ":let g:NETRRegister=[{}[getline('.')[0]]] <cr> :quit <cr>".
                format(ui_internal_vim_dict_name))

        new_buf.options['modifiable'] = True
        new_buf[:] = content
        new_buf.options['modifiable'] = False
        Vim.command('quit')
예제 #17
0
파일: rifle.py 프로젝트: xbl3/vim-netranger
    def __init__(self, path):
        self.rules = []

        if not os.path.isfile(path):
            Shell.cp(os.path.join(config_dir, 'rifle.conf'), path)

        with open(path, 'r') as f:
            for i, line in enumerate(f):
                try:
                    # remove things after the first # (including)
                    line = line[:line.index('#')]
                except ValueError:
                    pass

                line = line.strip()
                if len(line) == 0:
                    continue
                sp = line.split('=')
                if len(sp) != 2:
                    Vim.ErrorMsg(
                        'invalid rule: rifle.conf line {}. There should be one'
                        ' and only one "=" for each line'.format(i + 1))
                    continue

                tests = []
                for test in sp[0].strip().split(','):
                    testSp = [e for e in test.split(' ') if e != '']
                    tests.append(globals()[testSp[0]](*testSp[1:]))
                command = sp[1].strip()

                # simple case, used specify only the command
                # For sophisicated command like bash -c "command {}"
                # user should add '{}' themselves
                if '{}' not in command:
                    command = command + ' {}'
                self.rules.append((tests, command))
예제 #18
0
 def print_error(job_id, err_msg):
     # Truncate unnecessary message if from fs_server.py
     ind = err_msg.rfind('FSServerException: ')
     if ind > 0:
         err_msg = err_msg[ind + 19:]
     Vim.ErrorMsg(err_msg)
예제 #19
0
 def run(cls, cmd):
     try:
         return subprocess.check_output(
             cmd, shell=True, stderr=subprocess.STDOUT).decode('utf-8')
     except subprocess.CalledProcessError as e:
         Vim.ErrorMsg(e)
예제 #20
0
 def set_buf_common_option(self, modifiable=False):
     """ Set common option for a UI buffer. """
     Vim.command('setlocal noswapfile')
     Vim.command('setlocal foldmethod=manual')
     Vim.command('setlocal foldcolumn=0')
     Vim.command('setlocal nofoldenable')
     Vim.command('setlocal nobuflisted')
     Vim.command('setlocal nospell')
     Vim.command('setlocal buftype=nofile')
     Vim.command('setlocal bufhidden=hide')
     Vim.command('setlocal nomodifiable')
예제 #21
0
 def show(self, name='default'):
     """ Show the UI buffer. """
     Vim.command(f'{self.position} {self.bufs[name].number}sb')
     Vim.command('wincmd J')
예제 #22
0
 def commit_amend(self):
     msg = self.cur_repo.commit(amend=True)
     self.api.render()
     Vim.Echo(msg)
예제 #23
0
 def position(self):
     return Vim.Var('NETRSplitOrientation')
예제 #24
0
 def post_commit(self, bufNum):
     msg = self.cur_repo.commit()
     self.api.render(bufNum)
     Vim.Echo(msg)
예제 #25
0
    def unmodify(self, fullpath):

        ans = Vim.UserInput("This will discard any made changes. Proceed "
                            "anyway? (y/n)")
        if ans == 'y':
            self.run_cmd('checkout {}'.format(fullpath))
예제 #26
0
파일: fs.py 프로젝트: ipod825/vim-netranger
 def on_stderr(job_id, err_msg):
     ind = err_msg.rfind('FSServerException: ')
     if ind > 0:
         err_msg = err_msg[ind + 19:]
     Vim.ErrorMsg(err_msg)
예제 #27
0
파일: api.py 프로젝트: xbl3/vim-netranger
 def RegisterHookerVimFn(self, hooker, fn):
     self.Hookers[hooker].append(
         lambda api: Vim.eval(f'function("{fn}")()'))
예제 #28
0
파일: api.py 프로젝트: xbl3/vim-netranger
 def mapvimfn(self, key, fn):
     self.map(key, lambda: Vim.eval(f'function("{fn}")()'))
예제 #29
0
 def view_plaintext(self):
     bak_shortmess = Vim.options['shortmess']
     Vim.options['shortmess'] = 'A'
     Vim.command(f'silent edit {self.path}')
     Vim.options['shortmess'] = bak_shortmess
     Vim.current.window.options['foldenable'] = False