mirror of
https://github.com/amix/vimrc
synced 2025-06-16 01:25:00 +08:00
Use YankRing instead of yankstack
This commit is contained in:
@ -1,343 +0,0 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe "Yankstack" do
|
||||
let(:vim) { Vimbot::Driver.new }
|
||||
|
||||
before(:all) do
|
||||
vim.start
|
||||
|
||||
vim.set "visualbell"
|
||||
vim.set "noerrorbells"
|
||||
vim.set "macmeta"
|
||||
|
||||
vim.set "runtimepath+=#{PLUGIN_ROOT}"
|
||||
vim.runtime "plugin/yankstack.vim"
|
||||
|
||||
vim.source VIM_REPEAT_PATH
|
||||
end
|
||||
|
||||
after(:all) { vim.stop }
|
||||
before(:each) { vim.clear_buffer }
|
||||
|
||||
shared_examples "yanking and pasting" do
|
||||
let(:yank_keys) { "yw" }
|
||||
|
||||
before do
|
||||
vim.insert "first_line<CR>", "second_line<CR>", "third_line<CR>", "fourth_line"
|
||||
vim.normal "gg"
|
||||
vim.normal yank_keys, 'j', yank_keys, 'j', yank_keys, 'j', yank_keys
|
||||
end
|
||||
|
||||
it "pushes every yanked string to the :Yanks stack" do
|
||||
yank_entries[0].should match /0\s+fourth_line/
|
||||
yank_entries[1].should match /1\s+third_line/
|
||||
yank_entries[2].should match /2\s+second_line/
|
||||
yank_entries[3].should match /3\s+first_line/
|
||||
end
|
||||
|
||||
describe "yanking with different keys" do
|
||||
before do
|
||||
vim.normal "A", "<CR>", "line to delete", "<Esc>", "^"
|
||||
end
|
||||
|
||||
keys_that_change_register = [
|
||||
'cc', 'C',
|
||||
'dd', 'D',
|
||||
's', 'S',
|
||||
'x', 'X',
|
||||
'yy', 'Y'
|
||||
]
|
||||
|
||||
keys_that_change_register.each do |key|
|
||||
it "pushes to the stack when deleting text with '#{key}'" do
|
||||
vim.normal key
|
||||
yank_entries[1].should match /1\s+fourth_line/
|
||||
end
|
||||
end
|
||||
|
||||
it "pushes to the stack when overwriting text in select mode" do
|
||||
vim.type "V"
|
||||
vim.type "<c-g>", "this overwrites the last line"
|
||||
yank_entries[0].should include "line to delete"
|
||||
yank_entries[1].should include "fourth_line"
|
||||
end
|
||||
end
|
||||
|
||||
context "in normal mode" do
|
||||
before { vim.normal "o", "<Esc>" }
|
||||
|
||||
describe "pasting a string with 'p'" do
|
||||
before { vim.normal "p" }
|
||||
|
||||
it "pastes the most recently yanked string" do
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
|
||||
describe "pressing the repeat key with '.'" do
|
||||
it "pastes again" do
|
||||
pending unless File.exists?(VIM_REPEAT_PATH)
|
||||
|
||||
vim.type "."
|
||||
vim.line.should == "fourth_linefourth_line"
|
||||
end
|
||||
end
|
||||
|
||||
describe "typing the 'cycle paste' key" do
|
||||
before { vim.normal "<M-p>" }
|
||||
|
||||
it "replaces the pasted string with the previously yanked text" do
|
||||
vim.line.should == "third_line"
|
||||
end
|
||||
|
||||
it "rotates the previously yanked text to the top of the yank stack" do
|
||||
yank_entries[0].should include 'third_line'
|
||||
yank_entries[1].should include 'second_line'
|
||||
yank_entries[2].should include 'first_line'
|
||||
yank_entries[-1].should include 'fourth_line'
|
||||
end
|
||||
|
||||
it "rotates through the yanks when pressed multiple times" do
|
||||
vim.normal "<M-p>"
|
||||
vim.line.should == "second_line"
|
||||
vim.normal "<M-p>"
|
||||
vim.line.should == "first_line"
|
||||
|
||||
vim.normal "<M-P>"
|
||||
vim.line.should == "second_line"
|
||||
vim.normal "<M-P>"
|
||||
vim.line.should == "third_line"
|
||||
vim.normal "<M-P>"
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "typing the `substitute_older_paste` key without pasting first" do
|
||||
before { vim.type "<M-p>" }
|
||||
|
||||
it "pastes the most recently yanked string" do
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
|
||||
describe "typing the 'cycle paste' key" do
|
||||
before { vim.normal "<M-p>" }
|
||||
|
||||
it "replaces the pasted text with the previously yanked text" do
|
||||
vim.line.should == "third_line"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "typing the `substitute_newer_paste` key without pasting first" do
|
||||
before { vim.type "<M-P>" }
|
||||
|
||||
it "pastes the most recently yanked string" do
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
|
||||
describe "typing the 'cycle paste' key" do
|
||||
before { vim.normal "<M-p>" }
|
||||
|
||||
it "replaces the pasted text with the previously yanked text" do
|
||||
vim.line.should == "third_line"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "allows pasting from a non-default register" do
|
||||
reg = 'a'
|
||||
vim.normal "gg"
|
||||
vim.normal %("#{reg}y$)
|
||||
vim.normal "G"
|
||||
|
||||
vim.normal %("#{reg}p)
|
||||
vim.line.should == "first_line"
|
||||
end
|
||||
|
||||
it "allows pasting with a count" do
|
||||
vim.normal "3p"
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "fourth_line" * 3
|
||||
end
|
||||
end
|
||||
|
||||
context "in visual mode, with text highlighted" do
|
||||
before do
|
||||
vim.normal "A<CR>", "line to overwrite"
|
||||
vim.normal "V"
|
||||
end
|
||||
|
||||
describe "pasting a string with 'p'" do
|
||||
before do
|
||||
vim.type "p"
|
||||
end
|
||||
|
||||
it "overwrites the selection with the most recently yanked string" do
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
|
||||
it "moves the the overwritten text to the bottom of the stack" do
|
||||
yank_entries[0].should include "fourth_line"
|
||||
yank_entries[1].should include "third_line"
|
||||
yank_entries[2].should include "second_line"
|
||||
yank_entries[-1].should include "line to overwrite"
|
||||
end
|
||||
|
||||
describe "typing the 'cycle older paste' key" do
|
||||
before { vim.normal "<M-p>" }
|
||||
|
||||
it "replaces the pasted text with the previously yanked text" do
|
||||
vim.line.should == "third_line"
|
||||
end
|
||||
|
||||
it "moves the previously yanked text to the top of the stack" do
|
||||
yank_entries[0].should include "third_line"
|
||||
yank_entries[1].should include "second_line"
|
||||
yank_entries[2].should include "first_line"
|
||||
yank_entries[-2].should include "line to overwrite"
|
||||
yank_entries[-1].should include "fourth_line"
|
||||
end
|
||||
|
||||
describe "typing the 'cycle newer paste' key" do
|
||||
before { vim.normal "<M-P>" }
|
||||
|
||||
it "replaces the pasted text with the previously yanked text" do
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
|
||||
it "moves the previously yanked text to the top of the stack" do
|
||||
yank_entries[0].should include "fourth_line"
|
||||
yank_entries[1].should include "third_line"
|
||||
yank_entries[2].should include "second_line"
|
||||
yank_entries[3].should include "first_line"
|
||||
yank_entries[-1].should include "line to overwrite"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "typing the `substitute_older_paste` key without pasting first" do
|
||||
before { vim.type "<M-p>" }
|
||||
|
||||
it "overwrites the selection with the most recently yanked string" do
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
end
|
||||
|
||||
describe "typing the `substitute_newer_paste` key without pasting first" do
|
||||
before { vim.type "<M-P>" }
|
||||
|
||||
it "overwrites the selection with the most recently yanked string" do
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
end
|
||||
|
||||
it "allows pasting with a count" do
|
||||
vim.type "3p"
|
||||
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "fourth_line"
|
||||
|
||||
vim.normal 'j'
|
||||
vim.line_number.should == 6
|
||||
vim.line.should == "fourth_line"
|
||||
|
||||
vim.normal 'j'
|
||||
vim.line_number.should == 7
|
||||
vim.line.should == "fourth_line"
|
||||
end
|
||||
end
|
||||
|
||||
context "in insert mode" do
|
||||
before do
|
||||
vim.normal "A<Cr>", "()", "<Left>"
|
||||
vim.type "<M-p>"
|
||||
end
|
||||
|
||||
describe "typing the `substitute_older_paste` after a character-wise yank" do
|
||||
it "pastes the most recently yanked text after the cursor" do
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "(fourth_line)"
|
||||
end
|
||||
|
||||
it "stays in insert mode, with the cursor at the end of the pasted text" do
|
||||
vim.should be_in_insert_mode
|
||||
vim.column_number.should == "(fourth_line".length + 1
|
||||
end
|
||||
|
||||
describe "typing the `substitute_older_paste` key again" do
|
||||
before { vim.type "<M-p>" }
|
||||
|
||||
it "replaces the pasted text with the previously yanked text" do
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "(third_line)"
|
||||
end
|
||||
|
||||
it "stays in insert mode, with the cursor at the end of the pasted text" do
|
||||
vim.should be_in_insert_mode
|
||||
vim.column_number.should == "(third_line".length+1
|
||||
end
|
||||
|
||||
it "rotates the previously yanked text to the top of the yank stack" do
|
||||
yank_entries[0].should include 'third_line'
|
||||
yank_entries[1].should include 'second_line'
|
||||
yank_entries[2].should include 'first_line'
|
||||
yank_entries[-1].should include 'fourth_line'
|
||||
end
|
||||
|
||||
it "rotates through the yanks when pressed multiple times" do
|
||||
vim.type "<M-p>"
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "(second_line)"
|
||||
|
||||
vim.type "<M-p>"
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "(first_line)"
|
||||
|
||||
vim.type "<M-P>"
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "(second_line)"
|
||||
|
||||
vim.type "<M-P>"
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "(third_line)"
|
||||
|
||||
vim.type "<M-P>"
|
||||
vim.line_number.should == 5
|
||||
vim.line.should == "(fourth_line)"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "typing `substitute_older_paste` after a line-wise yank" do
|
||||
let(:yank_keys) { "yy" }
|
||||
|
||||
xit "pastes and puts the cursor after the pasted text" do
|
||||
vim.line_number.should == 6
|
||||
vim.line.should == ")"
|
||||
vim.type "<Up>"
|
||||
vim.line.should == "(fourth_line"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using the normal default register" do
|
||||
it_has_behavior "yanking and pasting"
|
||||
end
|
||||
|
||||
describe "when using the system clipboard as the default register" do
|
||||
before { vim.set "clipboard", "unnamed" }
|
||||
it_has_behavior "yanking and pasting"
|
||||
end
|
||||
|
||||
def yank_entries
|
||||
@yank_entries ||= vim.command("Yanks").split("\n")[1..-1]
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user