2015-09-21 1 views
1

В Sublime Text 3 (но я думаю, что это то же самое со ST2), я знаю, что когда вы копируете (CTRL + C), когда ничего не выбрано, вся строка копируется, но мне нужно знать, как вставить его ниже моего курсора.Скопируйте все ярлыки строк, затем вставьте его под курсором

В настоящее время вставить его над ним, и для меня это не кажется логичным, есть ли способ изменить это поведение?

ответ

1

Это не то, что он вставляет «выше» или «ниже», это значит, что он работает в текущей строке. Когда вы копируете без предварительного выбора, он копирует текущую строку. Когда вы вставляете это, он также работает в текущей строке - он вставляет буфер в эту строку, а в качестве побочного эффекта все, что было на этой линии, удалено с пути на следующую строку. Вместо этого невозможно поднять вверх - файл может только расти или добавлять новые строки вниз, вы не можете расти вверх за линией 1.

Что касается того, как изменить поведение, я бы предложил попробовать сделать макрос ,

http://docs.sublimetext.info/en/latest/extensibility/macros.html

Как указано в комментариях, макрос работает, но он оставляет вас с двумя различными способами, чтобы сделать пасту, один для нормального использования и другого такого поведения «вся строка». Это несчастливо, хотя есть другое (более сложное) решение. Вы можете попытаться написать плагин Sublime, чтобы определить, как вести себя и делать то, что вы хотите в каждом случае. Это немного больше, чем моя способность делать для вас ... но, подумав об этом, я понял, что у пакета Vintage уже есть команда для этого, потому что его пасты до и после курсора вставляются в ключи от p и P. соответственно. Я заглянул в пакет Vintage, чтобы найти, где они это сделали. Вот их код, хотя я не мог объяснить вам, как это работает. Вы хотели бы попытаться подражать ViPasteRight.

class ViPrefixableCommand(sublime_plugin.TextCommand): 
    # Ensure register and repeat are picked up from g_input_state, and that 
    # it'll be recorded on the undo stack 
    def run_(self, edit_token, args): 
     if not args: 
      args = {} 

     if g_input_state.register: 
      args['register'] = g_input_state.register 
      g_input_state.register = None 

     if g_input_state.prefix_repeat_digits: 
      args['repeat'] = digits_to_number(g_input_state.prefix_repeat_digits) 
      g_input_state.prefix_repeat_digits = [] 

     if 'event' in args: 
      del args['event'] 

     edit = self.view.begin_edit(edit_token, self.name(), args) 
     try: 
      return self.run(edit, **args) 
     finally: 
      self.view.end_edit(edit) 

class ViPasteRight(ViPrefixableCommand): 
    def advance(self, pt): 
     if self.view.substr(pt) == '\n' or pt >= self.view.size(): 
      return pt 
     else: 
      return pt + 1 

    def run(self, edit, register = '"', repeat = 1): 
     visual_mode = self.view.has_non_empty_selection_region() 
     if not visual_mode: 
      transform_selection(self.view, lambda pt: self.advance(pt)) 
     self.view.run_command('paste_from_register', {'forward': not visual_mode, 
                 'repeat': repeat, 
                 'register': register}) 

class ViPasteLeft(ViPrefixableCommand): 
    def run(self, edit, register = '"', repeat = 1): 
     self.view.run_command('paste_from_register', {'forward': False, 
                 'repeat': repeat, 
                 'register': register}) 

И вот как они связывают их с ключами. Если вы хотите попытаться адаптировать это, вам, вероятно, не понадобится context, это то, что им нужно из-за модальности природы Vintage.

{ "keys": ["P"], "command": "vi_paste_left", 
    "context": [{"key": "setting.command_mode"}] 
}, 

{ "keys": ["p"], "command": "vi_paste_right", 
    "context": [{"key": "setting.command_mode"}] 
}, 

Вот раздел документации о плагинах, если вы хотите попытаться решить его таким образом.

http://docs.sublimetext.info/en/latest/extensibility/plugins.html

+0

Ну тогда, я хотел бы что-то вроде: 'ENTER' ' CTRL + V' 'CTRL + МАЙ + k' (удалить всю строку) – Seekme

+0

Я не следую удаление линейной части. Вы пытаетесь получить свою пасту для * замены * текущей строки? Я думал, вы пытались вставить его ниже текущей строки, а не над ней. –

+0

Я действительно пытаюсь вставить его под текущей строкой, но если я нахожусь в текущей строке, нажмите ENTER, вставьте удар, удалите ** пустую строку **, созданную нажатием ENTER, у меня есть желаемое поведение. Вы говорите, что нет абсолютно ** никоим образом ** Я могу иметь то, что хочу? – Seekme

0

После ответа Dan Lowe, я сделал этот файл:
http://pastebin.com/7nPWZCPh
и добавил эту строку
{ "keys": ["ctrl+shift+v"], "command": "run_macro_file", "args": {"file": "res://Packages/User/paste_no_line.sublime-macro"}},
для привязок моего пользователя.
Работает по назначению, но у меня есть две разные команды вставки.